OIDC を使用して Okta と Alibaba Cloud 間のロールベース SSO を設定します。これにより、Okta のアプリケーションは、一時的な STS 認証情報を使用して Alibaba Cloud のリソースにアクセスできるようになります。
前提条件
Okta で OIDC アプリケーションを登録し、その発行者 URL とクライアント ID を取得します。この例では、次の値を使用します。
-
発行者 URL: https://dev-xxxxxx.okta.com
-
クライアント ID: 0oa294vi1vJoClev****
ステップ1:OIDC ID プロバイダーの作成
TestOidcProvider という名前の OIDC ID プロバイダーを作成します。IdP の URL を https://dev-xxxxxx.okta.com に、クライアント ID を 0oa294vi1vJoClev**** に設定します。
-
RAM 管理者として RAM コンソール にログインします。
-
ナビゲーションペインで、 を選択します。
-
ロールベースの SSO ログイン方式 タブで、[OIDC] タブをクリックし、IdP の作成 をクリックします。
-
IdP の作成 ページで、ID プロバイダーを設定します。
パラメーター
説明
[IdP 名]
名前は Alibaba Cloud アカウント内で一意である必要があります。
[発行者 URL]
外部 IdP から提供されます。
httpsで始まり、標準の URL 形式に従う必要があります。クエリ文字列 (?)、フラグメント (#)、ユーザー認証情報 (@) を含めることはできません。[フィンガープリントの確認]
発行者 URL のハイジャックや改ざんを防ぐために、外部 IdP からの HTTPS CA 証明書のサムプリントを設定します。
発行者 URL を入力して 指紋を取得 をクリックすると、Alibaba Cloud がサムプリントを自動的に計算します。セキュリティのために、ローカルでも計算し (OpenSSL を使用して OIDC ID プロバイダーのサムプリントを取得)、比較してください。値が異なる場合、発行者 URL が侵害されている可能性があります。URL を確認し、正しいサムプリントを入力してください。
説明IdP で証明書をローテーションする前に、新しい証明書のサムプリントを OIDC ID プロバイダーの設定に追加してください。少なくとも 1 日待ってから、証明書をローテーションしてください。新しい証明書で STS トークンを取得できることを確認した後、古いサムプリントを削除してください。
[クライアント ID]
外部 IdP は、アプリケーションを登録する際にクライアント ID を割り当てます。この ID は、発行された OIDC トークンの
audクレームに表示されます。OIDC から STS へのトークン交換中に、Alibaba Cloud はこのクライアント ID とaudクレームを照合して検証します。両者が一致した場合にのみ、ロールの引き受けに成功します。複数のアプリケーションが Alibaba Cloud にアクセスする場合は、複数のクライアント ID を追加します。最大:50。
[最も早い発行時間制限]
この時間制限より前に発行された OIDC トークンは、STS トークンと交換できません。
デフォルト値:12 時間。有効値:1~168 時間。
[注]
ID プロバイダーの説明。
-
IdP の作成 をクリックします。
ステップ2:OIDC 用 RAM ロールの作成
testoidc という名前の RAM ロールを作成し、ステップ 1 の TestOidcProvider ID プロバイダーを選択します。
-
RAM 管理者として RAM コンソールにログインします。
-
左側のナビゲーションウィンドウで、を選択します。
-
ロール ページで、ロール作成 をクリックします。

-
ロール作成 ページの右上隅にある Switch to Policy Editor をクリックします。

-
ポリシーエディターで、OIDC ID プロバイダーを指定します。
2 つのモードが利用可能です:
-
ビジュアルエディター
Principal セクションで、OIDC ID プロバイダーを指定します。


-
スクリプトエディター
PrincipalのFederatedフィールドで OIDC プロバイダーを指定し、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:issOIDC 発行者の URL。 トークン内の
issクレームがこの値と一致する必要があります。OIDC プロバイダーの発行者 URL と共に
StringEqualsを使用します。はい
https://dev-xxxxxx.okta.com
oidc:audOIDC オーディエンス。 トークン内の
audクレームがこの値と一致する必要があります。OIDC プロバイダーの 1 つ以上のクライアント ID と共に
StringEqualsを使用します。はい
0oa294vi1vJoClev****
oidc:subOIDC サブジェクト。ロールを引き受けることができるプリンシパルを制限します。
トークン内の
subクレームがこの条件と一致する必要があります。 最大 10 個の値を持つ任意の文字列条件演算子をサポートします。いいえ
00u294e3mzNXt4Hi****
-
ロール作成 ダイアログボックスで、ロール名 を入力し、OK をクリックします。
ステップ3:RAM ロールへの権限付与
ステップ 2 の testoidc RAM ロールに、Alibaba Cloud リソースにアクセスするために必要な権限を付与します。
-
RAM 管理者として RAM コンソールにログインします。
-
ナビゲーションペインで、 を選択します。
-
ロール ページで、対象の RAM ロールの名前をクリックします。
-
権限管理 タブで対象のポリシーを見つけ、操作 列の 権限剥奪 をクリックします。
複数のポリシーを選択し、ポリシーリストの下部にある 権限剥奪 をクリックして、複数の権限を一括で取り消すこともできます。
-
権限剥奪 ダイアログボックスで、権限剥奪 をクリックします。
ステップ4:Okta からの OIDC トークンの取得
Alibaba Cloud は、OIDC によるコンソールサインインをサポートしていません。代わりにプログラムによるアクセスを使用してください。認可コードフローなどの標準の OAuth 2.0 フローを通じて、Okta から OIDC トークンを取得します。
Okta の公式チュートリアル「リダイレクトと Auth JS を使用した SPA へのユーザーのサインイン」に従って、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:OIDC ID プロバイダーの作成での設定と一致することを確認してください。値が一致しない場合、AssumeRoleWithOIDC API の呼び出しは失敗します。
-
iss: [発行者 URL] と完全に一致する必要があります。
-
aud: [クライアント ID] と完全に一致する必要があります。
-
-
ページから
idTokenの値をコピーします。
ステップ5:OIDC トークンの STS トークンへの交換
AssumeRoleWithOIDC API を呼び出して、ステップ4で取得した OIDC トークンを STS トークンに交換します。
リクエストの例:
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 トークンを使用したリソースへのアクセス
ステップ5で取得した STS トークンを使用して、ロールの権限の範囲内で Alibaba Cloud のリソースにアクセスします。