このトピックでは、OpenID Connect (OIDC) を使用して Okta と Alibaba Cloud の間でロールベースのシングルサインオン (SSO) を実装する方法について説明します。このメソッドにより、Okta のアプリケーションは、セキュリティトークンサービス (STS) トークンとして提供される一時的な認証情報を使用して、Alibaba Cloud リソースに安全にアクセスできます。
前提条件
Okta で OIDC アプリケーションを登録し、アプリケーションの発行者 URL とクライアント ID を取得します。この例では、次のデータを使用します。
発行者 URL: https://dev-xxxxxx.okta.com
クライアント ID: 0oa294vi1vJoClev****
ステップ 1: Alibaba Cloud で OIDC IdP を作成する
このステップでは、TestOidcProvider という名前の OIDC ID プロバイダー (IdP) を作成します。[発行者 URL] を https://dev-xxxxxx.okta.com に、[クライアント ID] を 0oa294vi1vJoClev**** に設定します。
RAM 管理者として Resource Access Management (RAM) コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロールベース SSO] タブで、[OIDC] タブをクリックし、[IdP の作成] をクリックします。
[IdP の作成] ページで、IdP 情報を設定します。
パラメーター
説明
IdP 名
名前は Alibaba Cloud アカウント内で一意である必要があります。
発行者 URL
外部 IdP によって提供される発行者の URL。発行者 URL は
httpsで始まり、有効な URL である必要があります。URL には、疑問符 (?) に続くクエリパラメーター、番号記号 (#) で識別されるフラグメントセグメント、またはアットマーク (@) で識別されるログイン情報を含めることはできません。検証用の指紋
発行者 URL がハイジャックされたり改ざんされたりするのを防ぐために、外部 IdP の HTTPS CA 証明書から生成された検証用の指紋を構成します。
[発行者 URL] を入力した後、[指紋の取得] をクリックします。Alibaba Cloud は、検証用の指紋を自動的に計算するのに役立ちます。ローカルでも計算して結果を比較することをお勧めします。詳細については、「OpenSSL を使用して OIDC IdP の指紋を取得する」をご参照ください。指紋が一致しない場合、発行者 URL が攻撃を受けている可能性があります。URL を確認し、正しい指紋を入力してください。
説明IdP の証明書をローテーションする予定がある場合は、ローテーションの前に新しい証明書の指紋を生成し、Alibaba Cloud の OIDC IdP 情報に追加します。証明書をローテーションする前に、少なくとも 1 日待ってください。新しい証明書を使用してセキュリティトークンサービス (STS) トークンを取得できることを確認した後、古い指紋を削除できます。
クライアント ID
外部 IdP にアプリケーションを登録すると、クライアント ID が生成されます。外部 IdP から OIDC トークンをリクエストするときは、このクライアント ID を使用する必要があります。発行された OIDC トークンには、
audフィールドにこのクライアント ID が含まれています。OIDC IdP を作成するときに、このクライアント ID を構成します。OIDC トークンを使用して STS トークンを取得すると、Alibaba Cloud は OIDC トークンのaudフィールドのクライアント ID が OIDC IdP に構成されているクライアント ID と一致することを確認します。クライアント ID が一致する場合にのみ、ロールを偽装できます。Alibaba Cloud にアクセスする必要があるアプリケーションが複数ある場合は、複数のクライアント ID を構成できます。最大 50 個のクライアント ID を追加できます。
最も早い発行時刻
この時刻より前に発行された OIDC トークンは、STS トークンの取得には使用できません。
デフォルト: 12 時間。有効な値: 1~168 時間。
備考
IdP の説明。
[IdP の作成] をクリックします。
ステップ 2: Alibaba Cloud で OIDC IdP の RAM ロールを作成する
このステップでは、testoidc という名前の RAM ロールを作成し、ステップ 1 で作成した TestOidcProvider を ID プロバイダーとして選択します。
管理権限を持つ RAM ユーザーとして RAM コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。

[ロールの作成] ページの右上隅にある [ポリシーエディターに切り替え] をクリックします。

エディターで OIDC IdP を指定します。
エディターは、ビジュアル編集モードと JSON モードをサポートしています。
ビジュアルエディター
[プリンシパル] 要素に特定の OIDC IdP を指定します。


JSON
PrincipalパラメーターのFederatedフィールドに OIDC IdP を指定し、Conditionパラメーターを構成します。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "acs:ram::100*******0719:oidc-provider/xiyun****" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "oidc:iss": [ "https://dev-xxxxxx.okta.com" ], "oidc:aud": [ "0oa294vi1vJoClev****" ] } } } ] }
エディターで条件を指定します。
次の表に、サポートされているサービスレベルの条件キーを示します。
条件キー
説明
必須
例
oidc:iss発行者。RAM ロールを偽装するために使用する OIDC トークンの iss フィールドがこの条件を満たす場合にのみ、RAM ロールを偽装できます。
条件演算子は StringEquals である必要があります。値は、選択した OIDC IdP に指定した発行者の URL である必要があります。この条件を指定すると、OIDC トークンが信頼できる IdP によって発行された場合にのみ、OIDC トークンを使用して RAM ロールを偽装できるようになります。
はい
https://dev-xxxxxx.okta.com
oidc:audオーディエンス。RAM ロールを偽装するために使用する OIDC トークンの aud フィールドがこの条件を満たす場合にのみ、RAM ロールを偽装できます。
条件演算子は StringEquals である必要があります。値は、選択した OIDC IdP に指定した 1 つ以上のクライアント ID にすることができます。この条件を指定すると、指定したクライアント ID を使用して OIDC トークンが生成された場合にのみ、OIDC トークンを使用して RAM ロールを偽装できるようになります。
はい
0oa294vi1vJoClev****
oidc:subサブジェクト。RAM ロールを偽装するために使用する OIDC トークンの sub フィールドがこの条件を満たす場合にのみ、RAM ロールを偽装できます。
条件演算子は、すべてのタイプの文字列にすることができます。値は最大 10 個のサブジェクトにすることができます。この条件を指定して、RAM ロールを偽装するために使用できる ID をさらに制限できます。この条件を指定しないままにすることもできます。
いいえ
00u294e3mzNXt4Hi****
[ロールの作成] ダイアログボックスで、[ロール名] パラメーターを構成し、[OK] をクリックします。
ステップ 3: RAM ロールに権限を付与する
ステップ 2 で作成した testoidc という名前の RAM ロールに、必要に応じて Alibaba Cloud リソースへのアクセス権限を付与できます。
RAM 管理者として RAM コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、管理する RAM ロールを見つけ、[アクション] 列の [権限の付与] をクリックします。

複数の RAM ロールを選択し、RAM ロールリストの下部にある [権限の付与] をクリックして、一度に複数の RAM ロールに権限を付与することもできます。
[権限の付与] パネルで、RAM ロールに権限を付与します。
リソース範囲パラメーターを構成します。
アカウント: 権限付与は現在の Alibaba Cloud アカウントで有効になります。
リソースグループ: 権限付与は特定のリソースグループで有効になります。
説明リソース範囲パラメーターにリソースグループを選択した場合は、必要なクラウドサービスがリソースグループをサポートしていることを確認してください。詳細については、「リソースグループと連携するサービス」をご参照ください。
プリンシパルパラメーターを構成します。
プリンシパルは、権限を付与する RAM ロールです。現在の RAM ロールが自動的に選択されます。
ポリシーパラメーターを構成します。
ポリシーは、アクセス権限のセットです。一度に複数のポリシーを選択できます。
システムポリシー: Alibaba Cloud によって作成されるポリシー。これらのポリシーは使用できますが、変更はできません。ポリシーのバージョン更新は Alibaba Cloud によって維持されます。詳細については、「RAM と連携するサービス」をご参照ください。
説明システムは、AdministratorAccess や AliyunRAMFullAccess などのリスクの高いシステムポリシーを自動的に識別します。リスクの高いポリシーをアタッチして不要な権限を付与しないことをお勧めします。
カスタムポリシー: ビジネス要件に基づいてカスタムポリシーを管理および更新できます。カスタムポリシーを作成、更新、削除できます。詳細については、「カスタムポリシーの作成」をご参照ください。
[権限の付与] をクリックします。
[閉じる] をクリックします。
ステップ 4: Okta で OIDC トークンを発行する
Alibaba Cloud は、OpenID Connect (OIDC) を使用したコンソールログインをサポートしていません。OIDC シングルサインオン (SSO) フローを完了するには、プログラムによるアクセスを使用する必要があります。Okta などの OIDC ID プロバイダー (IdP) から OIDC トークンを取得するには、標準の OAuth 2.0 フローを使用する必要があります。OAuth は、一般的な Authorization Code Flow など、複数のフローをサポートしています。
次の例は、Okta の公式チュートリアル Sign in to your SPA with AuthJS に基づいており、Okta から OIDC トークンを取得する方法を示しています。
Okta のチュートリアルに従って、アプリケーションを作成し、プロジェクトを構成します。
ブラウザでプロジェクトをテストします。アプリケーションは自動的に Okta ログインページにリダイレクトします。ログインして多要素認証 (MFA) を完了すると、ページは
index.htmlにリダイレクトします。ページには、現在のユーザーの ID トークンと、以下に示すように解析されたクレームが表示されます。{ "idToken": "eyJraWQiOiItbUF****", "claims": { "sub": "00uxbq0z40UYy9bm****", "name": "ssotest01", "email": "ssotest01@exampledomain.com", "ver": 1, "iss": "https://dev-xxxxxx.okta.com", "aud": "0oaxbqhfrfBl5lk2****", "iat": 1762841679, "exp": 1762845279, "jti": "ID.WYtCLmLKOlMcEh0uIe1jWH9T6M1JmotCvX3hIgLK6mA", "amr": [ "mfa", "otp", "pwd", "okta_verify" ], "idp": "00oxbpgns1TnfLFg****", "nonce": "Xp0PTyQzw9ltYBY7SfhxG2ijt1wgi2jK6XLZOGbeQJQ79d0ScWYoHE5twl0QAklA", "preferred_username": "ssotest01@exampledomain.com", "auth_time": 1762841677, "at_hash": "wztv8ALAo2Au56Om3dya7w" }, "expiresAt": 1762845279, "scopes": [ "openid", "profile", "email" ], "authorizeUrl": "https://dev-xxxxxx.okta.com/oauth2/v1/authorize", "issuer": "https://dev-xxxxxx.okta.com", "clientId": "0oaxbqhfrfBl5lk2****" }説明ページに表示されるクレームから、次のプロパティを見つけます。ステップ 1: Alibaba Cloud で OIDC IdP を作成する で構成した OIDC IdP 情報と一致することを確認してください。一致しない場合、AssumeRoleWithOIDC API 操作の呼び出しは失敗します。
iss: 発行者 URL と完全に一致する必要があります。
aud: クライアント ID と完全に一致する必要があります。
ページから
idTokenの値をコピーして保存します。
ステップ 5: OIDC トークンを使用して STS トークンを取得する
AssumeRoleWithOIDC API 操作を呼び出して、STS トークンを取得します。リクエストで、ステップ 4 で取得した OIDC トークン (ID トークン) を指定します。
リクエストの例:
package demo;
import com.aliyun.auth.credentials.provider.AnonymousCredentialProvider;
import com.aliyun.sdk.service.sts20150401.models.*;
import com.aliyun.sdk.service.sts20150401.*;
import com.google.gson.Gson;
import darabonba.core.client.ClientOverrideConfiguration;
import java.util.concurrent.CompletableFuture;
public class AssumeRoleWithOIDC {
public static void main(String[] args) throws Exception {
// 匿名アクセス方式 (API サポートが必要)
AnonymousCredentialProvider provider = AnonymousCredentialProvider.create();
// クライアントの設定
AsyncClient client = AsyncClient.builder()
.region("cn-hangzhou") // リージョン ID
.credentialsProvider(provider)
// クライアントレベルの設定書き換え、エンドポイント、Http リクエストパラメーターなどを設定可能
.overrideConfiguration(
ClientOverrideConfiguration.create()
// エンドポイントについては、https://api.aliyun.com/product/Sts をご参照ください
.setEndpointOverride("sts.cn-hangzhou.aliyuncs.com")
)
.build();
String idToken = "eyJraWQiOiItbUF****"; // OIDC ID トークン
// API リクエストのパラメーター設定
AssumeRoleWithOIDCRequest assumeRoleWithOIDCRequest = AssumeRoleWithOIDCRequest.builder()
.OIDCToken(idToken)
.roleArn("acs:ram::173305794806****:role/testoidc")
.OIDCProviderArn("acs:ram::173305794806****:oidc-provider/Okta")
.roleSessionName("test-oidc-session")
.build();
// API リクエストの戻り値を非同期で取得
CompletableFuture<AssumeRoleWithOIDCResponse> response = client.assumeRoleWithOIDC(assumeRoleWithOIDCRequest);
// API リクエストの戻り値を同期的に取得
AssumeRoleWithOIDCResponse resp = response.get();
System.out.println("RequestId: " + resp.getBody().getRequestId());
System.out.println("Assume role ARN: " + resp.getBody().getAssumedRoleUser().getArn());
System.out.println("Credentials AccessKeyId: " + resp.getBody().getCredentials().getAccessKeyId());
System.out.println("Credentials AccessKeySecret: " + resp.getBody().getCredentials().getAccessKeySecret());
System.out.println("Success response: " + new Gson().toJson(resp.getBody()));
// 最後に、クライアントを閉じます
client.close();
}
}
応答の例:
RequestId: 5EB6E605-15EA-5D96-941D-2C62DC99****
Assume role ARN: acs:ram::173305794806****:role/testoidc/test-oidc-session
Credentials AccessKeyId: STS.NZXMTBGTTHLW74AMVYKou****
Credentials AccessKeySecret: FdrYjJwTCfFfMdY4APdHsjGL9fH5RSZCtRyYMJED****
Success response:
{
"assumedRoleUser": {
"arn": "acs:ram::173305794806****:role/testoidc/test-oidc-session",
"assumedRoleId": "30048007026011****:test-oidc-session"
},
"credentials": {
"accessKeyId": "STS.NZXMTBGTTHLW74AMVYKou****",
"accessKeySecret": "FdrYjJwTCfFfMdY4APdHsjGL9fH5RSZCtRyYMJED****",
"expiration": "2025-11-11T08:01:03Z",
"securityToken": "CAISwwJ1q6Ft5B2yfSjI****"
},
"OIDCTokenInfo": {
"clientIds": "0oaxbqhfrfBl5lk2****",
"expirationTime": "2025-11-11T07:14:39Z",
"issuanceTime": "2025-11-11T06:14:39Z",
"issuer": "https://dev-xxxxxx.okta.com",
"subject": "00uxbq0z40UYy9bm****",
"verificationInfo": "Success"
},
"requestId": "5EB6E605-15EA-5D96-941D-2C62DC99****"
}Credentials オブジェクトには STS トークンが含まれています。
ステップ 6: STS トークンを使用して Alibaba Cloud リソースにアクセスする
ステップ 5 で取得した STS トークンを使用して、Alibaba Cloud リソースにアクセスします。