OpenID Connect(OIDC)は、Open Authorization(OAuth)2.0 プロトコルに基づいて構築された認証プロトコルレイヤーです。このトピックでは、OIDC を使用してユーザー情報を取得する方法について説明します。
前提条件
Web アプリケーションが作成されています。アプリケーションの名前、OAuth スコープ、コールバック URL が指定されています。アプリケーションのアプリケーションシークレットが作成されています。詳細については、「アプリケーションを作成する」、「OAuth スコープを追加する」、および「アプリケーションシークレットを作成する」をご参照ください。
用語
用語 | 説明 |
ID トークン | OIDC は、ユーザーの ID トークンをアプリケーションに発行できます。ID トークンを使用して、ユーザー名やログイン名などのユーザー情報を取得できます。 ID トークンを使用して Alibaba Cloud リソースにアクセスすることはできません。 |
OIDC ディスカバリーエンドポイント | OIDC は、さまざまな目的のためにさまざまなエンドポイントを提供します。ディスカバリーエンドポイントには、OIDC に必要な構成情報が含まれています。 説明 ディスカバリーエンドポイントは、JSON ドキュメントにキーのセットを提供します。キーには、OIDC プロバイダーに関する情報(OIDC でサポートされているレスポンスタイプ、トークン発行者の値、ID トークンの署名公開鍵エンドポイント、署名アルゴリズムなど)が含まれています。 OIDC プロバイダーとして、Alibaba Cloud は構成を簡素化するために次のディスカバリーエンドポイントを提供します。 ディスカバリーエンドポイントの内容の例を次に示します。 |
プロセス

ユーザーがブラウザを使用してアプリケーションにログインします。
アプリケーションはユーザーを Alibaba Cloud OIDC サービスにリダイレクトし、アプリケーションの URL をブラウザに送信します。
説明ユーザーが Alibaba Cloud にログインしていない場合、アプリケーションはユーザーを Alibaba Cloud ログインページにリダイレクトします。
ユーザーはブラウザを使用して Alibaba Cloud OIDC サービスにログインし、認証コードをリクエストします。
Alibaba Cloud OIDC サービスは、認証コードをブラウザに返します。
アプリケーションは、Alibaba Cloud OIDC サービスからユーザーに対応する ID トークンをリクエストします。リクエストには認証コードが必要です。
Alibaba Cloud OIDC サービスは、ID トークンとアクセストークンをアプリケーションに返します。アプリケーションは、ID トークンまたはアクセストークンを使用してユーザー情報を取得できます。
ID トークンを解析してユーザー情報を取得します。
アプリケーションは ID トークンの署名を検証する必要があります。アプリケーションは ID トークンの署名公開鍵を取得し、ID トークンの JSON Web トークン(JWT)署名を検証してから、解析されたユーザー情報を取得します。詳細については、「例 1:ID トークンの署名公開鍵を取得する」、「例 2:ID トークンの JWT 署名を検証する」、および「例 3:ID トークンを解析してユーザー情報を取得する」をご参照ください。
ID トークンを使用して、アプリケーションのさまざまなモジュールと通信します。
アプリケーションは ID トークンの署名を検証する必要があります。アプリケーションは ID トークンの署名公開鍵を取得し、ID トークンの JWT 署名を検証します。詳細については、「例 1:ID トークンの署名公開鍵を取得する」および「例 2:ID トークンの JWT 署名を検証する」をご参照ください。
アクセストークンを使用して、ユーザー情報を複数回クエリします。
アプリケーションがアクセストークンを取得した後、アプリケーションは UserInfo 操作を呼び出してユーザー情報を取得します。 UserInfo 操作は、アクセストークンを使用してのみ呼び出すことができ、応答情報はエンコードされません。詳細については、「例 4:アクセストークンと UserInfo 操作を使用してユーザー情報を取得する」をご参照ください。
例 1:ID トークンの署名公開鍵を取得する
リクエスト例
// 署名公開鍵を取得します。
private List getSignPublicKey() {
HttpResponse response = HttpClientUtils.doGet("https://oauth.alibabacloud.com/v1/keys");
List rsaKeyList = new ArrayList();
if (response.getCode() == 200 && response.isSuccess()) {
String keys = JSON.parseObject(response.getData()).getString("keys");
try {
JSONArray publicKeyList = JSON.parseArray(keys);
for (Object object : publicKeyList) {
RSAKey rsaKey = RSAKey.parse(JSONObject.toJSONString(object));
rsaKeyList.add(rsaKey);
}
return rsaKeyList;
} catch (Exception e) {
LOG.info(e.getMessage());
}
}
LOG.info("GetSignPublicKey failed:{}", response.getData());
throw new AuthenticationException(response.getData());
} 例 2:ID トークンの JWT 署名を検証する
Alibaba Cloud によって発行される ID トークンは、署名付き JSON JWT です。JWS 標準に準拠した RS256 署名アルゴリズムが使用されます。アプリケーションがユーザー情報をリクエストする場合、アプリケーションは ID トークンの次の内容を検証する必要があります。
トークン署名:アプリケーションは、例 1:ID トークンの署名公開鍵を取得する の OAuth 発行の署名公開鍵を使用して、ID トークンが有効かどうかを確認します。
OAuth 公開鍵は定期的にローテーションされます。このような公開鍵を取得する場合は、次の点に注意してください。
後で使用するために公開鍵をキャッシュまたは保存しないでください。リクエストごとに公開鍵を取得します。
公開鍵のローテーション中は、複数の有効な公開鍵が存在します。署名検証が成功するまで、すべての公開鍵を使用して順番に署名を検証する必要があります。署名の検証に使用できる公開鍵の数を指定しないでください。
リクエスト例
// ID トークンの JWT 署名を検証します。
public boolean verifySign(SignedJWT signedJWT) {
List publicKeyList = getSignPublicKey();
RSAKey rsaKey = null;
for (RSAKey key : publicKeyList) {
if (signedJWT.getHeader().getKeyID().equals(key.getKeyID())) {
rsaKey = key;
}
}
if (rsaKey != null) {
try {
RSASSAVerifier verifier = new RSASSAVerifier(rsaKey.toRSAPublicKey());
if (signedJWT.verify(verifier)) {
return true;
}
} catch (Exception e) {
LOG.info("Verify exception:{}", e.getMessage());
}
}
throw new AuthenticationException("Can't verify signature for id token");
}トークンの有効性:Alibaba Cloud は、ID トークンが発行された時刻と ID トークンの有効期間を確認します。
トークンの受信者:Alibaba Cloud は、他のアプリケーションに発行された ID トークンがアプリケーションに発行されないようにします。
例 3:ID トークンを解析してユーザー情報を取得する
レスポンスパラメーター
ヘッダーパラメーター
パラメーター
説明
必須 OAuth スコープ
alg
署名アルゴリズム。
openid
kid
ID トークンの検証に使用される公開鍵。この鍵を使用して署名を検証し、ID トークンが改ざんされないようにする必要があります。
openid
ボディパラメーター
パラメーター
説明
必須 OAuth スコープ
exp
トークンの有効期限が切れるタイムスタンプ。
openid
sub
ユーザーを示す一意の文字列。文字列には、ユーザーの UID とユーザー名は含まれていません。
説明ユーザーが Resource Access Management(RAM)ロールをアシュームする場合、sub パラメーターの値は
<RoleId:RoleSessionName>に基づいて生成されます。値は一意であり、ユーザーごとに生成されます。openid
aud
トークンの受信者。OAuth アプリケーションの ID です。
openid
iss
トークンの発行者。値は https://oauth.alibabacloud.com です。
openid
iat
トークンが発行されたタイムスタンプ。
openid
type
ユーザーのタイプ。有効な値:
account:Alibaba Cloud アカウント
user:RAM ユーザー。
role:RAM ロール。
profile
name
ユーザーの表示名。有効な値:
RAM ユーザーが使用されている場合、値は RAM ユーザーの表示名です。
RAM ロールが使用されている場合、値は
<RoleName:RoleSessionName>形式です。
説明このパラメーターは、RAM ユーザーまたは RAM ロールがリクエストを開始した場合にのみ返されます。
profile
upn
RAM ユーザーのログイン名。
説明このパラメーターは、RAM ユーザーがリクエストを開始した場合にのみ返されます。
profile
login_name
Alibaba Cloud アカウントのログイン名。
説明このパラメーターは、Alibaba Cloud アカウントがリクエストを開始した場合にのみ返されます。
profile
aid
ユーザーが属する Alibaba Cloud アカウントの ID。
aliuid
uid
ユーザーの ID。有効な値:
Alibaba Cloud アカウントが使用されている場合、値は aid パラメーターの値と同じです。
RAM ユーザーが使用されている場合、値は RAM ユーザーの ID です。
RAM ロールが使用されている場合、値は RAM ロールの ID です。
aliuid
レスポンス例
レスポンスヘッダーの例
{ "alg": "RS256", "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****" }レスポンスボディの例
デモンストレーションのために、次のレスポンス例は、エンコード前の ID トークンを示しています。実際のシナリオでは、エンコードされた ID トークンが返されます。詳細については、「例 2:ID トークンの JWT 署名を検証する」をご参照ください。
Alibaba Cloud アカウント開始リクエストのレスポンスボディの例
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "account", "login_name":"alice@example.com", //Alibaba Cloud アカウントのログイン名。 "aid": "123456789012****", //Alibaba Cloud アカウントの ID。 "uid": "123456789012****" //Alibaba Cloud アカウントの ID。 }RAM ユーザー開始リクエストのレスポンスボディの例
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "user", "name": "alice", //RAM ユーザーの表示名。 "upn": "alice@example.onaliyun.com", //RAM ユーザーのログイン名。 "aid": "123456789012****", //RAM ユーザーが属する Alibaba Cloud アカウントの ID。 "uid": "234567890123****" //RAM ユーザーの ID。 }RAM ロール開始リクエストのレスポンスボディの例
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.aliyun.com", "iat": 1517535923, "type": "role", "name": "NetworkAdministrator:alice", //RAM ロールの表示名。 "aid": "123456789012****", //RAM ロールが属する Alibaba Cloud アカウントの ID。 "uid": "300800165472****" //RAM ロールの ID。 }
例 4:アクセストークンと UserInfo 操作を使用してユーザー情報を取得する
アクセストークンを取得した後、UserInfo 操作を呼び出してユーザー情報を取得できます。 UserInfo 操作は、アクセストークンを使用してのみ呼び出すことができ、応答情報はエンコードされません。
OIDC の実際の使用シナリオでは、openid、aliuid、および profile スコープのみが指定されている場合でも、アクセストークンが返される可能性があります。返されたアクセストークンは、UserInfo 操作の呼び出しにのみ使用できます。
UserInfo 操作のエンドポイントは、https://oauth.alibabacloud.com/v1/userinfo です。
リクエスト例
// アクセストークンと UserInfo 操作を使用してユーザー情報を取得します。
GET v1/userinfo HTTP/1.1
Host: oauth.alibabacloud.com
Authorization: Bearer SIAV32hkKGレスポンスパラメーター
パラメーター | 説明 | 必須 OAuth スコープ |
sub | ユーザーを示す一意の文字列。文字列には、ユーザーの UID とユーザー名は含まれていません。 | openid |
type | ユーザーのタイプ。 | profile |
name | ユーザーの表示名。 説明 このパラメーターは、RAM ユーザーまたは RAM ロールがリクエストを開始した場合にのみ返されます。 | profile |
upn | RAM ユーザーのログイン名。 説明 このパラメーターは、RAM ユーザーがリクエストを開始した場合にのみ返されます。 | profile |
login_name | Alibaba Cloud アカウントのログイン名。 説明 このパラメーターは、Alibaba Cloud アカウントがリクエストを開始した場合にのみ返されます。 | profile |
aid | ユーザーが属する Alibaba Cloud アカウントの ID。 | aliuid |
uid | ユーザーの ID。 | aliuid |
レスポンスボディの例
Alibaba Cloud アカウント開始リクエストのレスポンスボディの例
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "account", "login_name":"alice@example.com", //Alibaba Cloud アカウントのログイン名。 "aid": "123456789012****", //Alibaba Cloud アカウントの ID。 "uid": "123456789012****" //Alibaba Cloud アカウントの ID。 }RAM ユーザー開始リクエストのレスポンスボディの例
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "user", "name": "alice", //RAM ユーザーの表示名。 "upn": "alice@example.onaliyun.com", //RAM ユーザーのログイン名。 "aid": "123456789012****", //RAM ユーザーが属する Alibaba Cloud アカウントの ID。 "uid": "234567890123****" //RAM ユーザーの ID。 }RAM ロール開始リクエストのレスポンスボディの例
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "role", "name": "NetworkAdministrator:alice", //RAM ロールの表示名。 "aid": "123456789012****", //RAM ロールが属する Alibaba Cloud アカウントの ID。 "uid": "300800165472****" //RAM ロールの ID。 }