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

ユーザーはブラウザを使用してアプリケーションにログインします。
アプリケーションはユーザーを 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 トークンの JSON Web トークン (JWT) 署名を検証します。詳細については、「例 2: ID トークンの JWT 署名の検証」をご参照ください。
アクセストークンを使用して、ユーザー情報を複数回クエリします。
アプリケーションがアクセストークンを取得した後、アプリケーションは 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 公開鍵は定期的にローテーションされます。このような公開鍵を取得する際は、次の点に注意してください。
公開鍵をキャッシュしたり、その後の使用のために保存したりしないでください。リクエストごとに公開鍵を取得してください。
公開鍵のローテーション中には、複数の有効な公開鍵が存在します。署名検証が成功するまで、すべての公開鍵を順番に使用して署名を検証する必要があります。署名検証に使用できる公開鍵の数を指定しないでください。
リクエスト例
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 とユーザー名は含まれません。
説明ユーザーがリソースアクセス管理 (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。
リクエスト例
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。 }