OpenID Connect (OIDC) は OAuth 2.0 上に構築された ID レイヤーです。ご利用のアプリケーションは OIDC を使用して、Alibaba Cloud にサインインするユーザーに関する情報を取得できます。
前提条件
以下のタスクを完了している必要があります:アプリケーションの作成、OAuth スコープの管理、および クライアントシークレットの作成。
基本概念
|
概念 |
説明 |
|
ID トークン |
OIDC は、サインイン済みユーザーを表す ID トークンを発行します。このトークンには、表示名やログイン名などのユーザー情報が含まれますが、Alibaba Cloud サービスへのアクセスはできません。 |
|
OIDC ディスカバリーエンドポイント |
OIDC プロトコルでは複数のエンドポイントが定義されています。ディスカバリーエンドポイントにはすべての OIDC 構成が含まれており、開発者が統合を簡素化できます。 説明
ディスカバリーエンドポイントは、プロバイダーメタデータを含む JSON ドキュメントを返します。これには、サポートされるレスポンスタイプ、Issuer 値、ID トークンの署名検証用公開鍵 URL、およびサポートされる署名アルゴリズムが含まれます。 Alibaba Cloud OIDC ディスカバリーエンドポイント: ディスカバリーエンドポイントからの応答例:
|
仕組み

-
ユーザーがブラウザからアプリケーションにサインインします。
-
ご利用のアプリケーションは、ユーザーのブラウザを Alibaba Cloud OIDC サービスにリダイレクトします。
説明ユーザーがまだサインインしていない場合、リクエストはさらに Alibaba Cloud サインインサービスにリダイレクトされます。
-
ユーザーは Alibaba Cloud にサインインし、ご利用のアプリケーションに権限付与します。
-
Alibaba Cloud OIDC サービスは、ユーザーのブラウザを認証コード付きでご利用のアプリケーションにリダイレクトします。
-
ご利用のアプリケーションは、認証コードを Alibaba Cloud OIDC サービスに送信して ID トークンと交換します。
-
Alibaba Cloud OIDC サービスは、ID トークンとアクセストークンをアプリケーションに返します。その後、アプリケーションは ID トークンまたはアクセストークンのいずれかを使用してユーザー情報を取得できます。
主な利用シーン:
-
ID トークンを直接解析してユーザー情報を取得します。
アプリケーションは ID トークンの署名を検証する必要があります。具体的には、公開鍵を取得 (例 1:署名用公開鍵の取得) し、JWT 署名を検証 (例 2:JWT 署名の検証) したうえで、ユーザー情報を解析 (例 3:ID トークンの解析) します。
-
ID トークンを異なるモジュール間の通信に使用します。
アプリケーションは ID トークンの署名を検証する必要があります。具体的には、公開鍵を取得 (例 1:署名用公開鍵の取得) し、JWT 署名を検証 (例 2:JWT 署名の検証) します。
-
アクセストークンを使用して複数回ユーザー情報をクエリします。
アクセストークンを取得後、アプリケーションは UserInfo エンドポイントを呼び出してユーザー情報を取得します (例 4:UserInfo エンドポイントの使用)。
-
例 1:署名用公開鍵の取得
リクエスト例:
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:JWT 署名の検証
Alibaba Cloud の ID トークンは、JWS 標準で定義されている RS256 署名アルゴリズムを使用して署名された JSON Web トークン (JWT) です。各 ID トークンは以下の項目をチェックして検証します。
-
署名検証:OAuth サービスの公開鍵 (例 1) を使用して、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"); } -
-
有効期間の検証:トークンの発行時刻と有効期限が有効であることを確認します。
-
オーディエンスの検証:aud クレームがご利用のアプリケーションのクライアント ID と一致することを確認します。
例 3:ID トークンの解析
-
応答パラメーター
-
ヘッダークレーム
パラメーター
説明
OAuth スコープ
alg
署名アルゴリズム。
openid
kid
トークンの署名に使用された公開鍵の ID。このキーを使用して署名を検証し、改ざんを防止します。
openid
-
ボディクレーム
パラメーター
説明
OAuth スコープ
exp
トークンの有効期限を示すタイムスタンプ。
openid
sub
サインイン済みユーザーの一意かつ安定した識別子。Alibaba Cloud UID やユーザー名などの情報は含まれません。
説明サインイン済みユーザーが RAM ロールの場合、sub クレームは
<RoleId:RoleSessionName>から生成されます。各ロールセッションには独自の sub 値があります。openid
aud
トークンのオーディエンス。ご利用のアプリケーションのクライアント 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 アカウント (プライマリアカウント) の場合:Alibaba Cloud アカウント ID。aid 値と同じです。
-
RAM ユーザーの場合:RAM ユーザー ID。
-
RAM ロールの場合:RAM ロール ID。
aliuid
-
-
-
応答例
-
ヘッダー例
{ "alg": "RS256", "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****" } -
本文例
これらの例は、デコードされた ID トークンのペイロードを示しています。実際のトークンは、検証が必要な単一のエンコード済み JWT 文字列です (例 2: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.alibabacloud.com", "iat": 1517535923, "type": "role", "name": "NetworkAdministrator:alice", // RAM ロールの表示名 "aid": "123456789012****", // RAM ロールが所属する Alibaba Cloud アカウントの ID "uid": "300800165472****" // RAM ロールの ID }
-
-
例 4:UserInfo エンドポイントの使用
アクセストークンを使用して UserInfo エンドポイントを呼び出し、ユーザー情報を取得することもできます。この応答はエンコードされません。
openid、aliuid、および profile スコープのみをリクエストした場合でも、アクセストークンが返されます。ただし、このトークンは UserInfo エンドポイント専用にスコープが制限されています。
UserInfo エンドポイントの URL は https://oauth.alibabacloud.com/v1/userinfo です。
リクエスト例:
GET v1/userinfo HTTP/1.1
Host: oauth.alibabacloud.com
Authorization: Bearer SIAV32hkKG
応答パラメーター:
|
パラメーター |
説明 |
OAuth スコープ |
|
sub |
サインイン済みユーザーの一意かつ安定した識別子。Alibaba Cloud 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 }