すべてのプロダクト
Search
ドキュメントセンター

Resource Access Management:OIDC を使用したユーザー情報の取得

最終更新日:May 24, 2025

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 は構成を簡素化するために次のディスカバリーエンドポイントを提供します。https://oauth.alibabacloud.com/.well-known/openid-configuration

ディスカバリーエンドポイントの内容の例を次に示します。

{
  "code_challenge_methods_supported": [
    "plain",
    "S256"
  ],
  "subject_types_supported": [
    "public"
  ],
  "response_types_supported": [
    "code"
  ],
  "issuer": "https://oauth.alibabacloud.com",
  "jwks_uri": "https://oauth.alibabacloud.com/v1/keys",
  "revocation_endpoint": "https://oauth.alibabacloud.com/v1/revoke",
  "token_endpoint": "https://oauth.alibabacloud.com/v1/token",
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "scopes_supported": [
    "openid",
    "aliuid",
    "profile"
  ],
  "authorization_endpoint": "https://signin.alibabacloud.com/oauth2/v1/auth"
}

プロセス

IODC基本流程

  1. ユーザーがブラウザを使用してアプリケーションにログインします。

  2. アプリケーションはユーザーを Alibaba Cloud OIDC サービスにリダイレクトし、アプリケーションの URL をブラウザに送信します。

    説明

    ユーザーが Alibaba Cloud にログインしていない場合、アプリケーションはユーザーを Alibaba Cloud ログインページにリダイレクトします。

  3. ユーザーはブラウザを使用して Alibaba Cloud OIDC サービスにログインし、認証コードをリクエストします。

  4. Alibaba Cloud OIDC サービスは、認証コードをブラウザに返します。

  5. アプリケーションは、Alibaba Cloud OIDC サービスからユーザーに対応する ID トークンをリクエストします。リクエストには認証コードが必要です。

  6. Alibaba Cloud OIDC サービスは、ID トークンとアクセストークンをアプリケーションに返します。アプリケーションは、ID トークンまたはアクセストークンを使用してユーザー情報を取得できます。

例 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 の実際の使用シナリオでは、openidaliuid、および 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。
    }