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

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

最終更新日:Mar 06, 2026

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 を提供します。https://oauth.alibabacloud.com/.well-known/openid-configuration

Discovery Endpoint の内容を次の例に示します。

{
  "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 公開鍵は定期的にローテーションされます。このような公開鍵を取得する際は、次の点に注意してください。

    • 公開鍵をキャッシュしたり、その後の使用のために保存したりしないでください。リクエストごとに公開鍵を取得してください。

    • 公開鍵のローテーション中には、複数の有効な公開鍵が存在します。署名検証が成功するまで、すべての公開鍵を順番に使用して署名を検証する必要があります。署名検証に使用できる公開鍵の数を指定しないでください。

リクエスト例

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