OIDC プロバイダーを ID プール IdP としてセットアップする - Amazon Cognito

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

OIDC プロバイダーを ID プール IdP としてセットアップする

OpenID Connect は認証のためのオープン標準で、多数のログインプロバイダーでサポートされています。Amazon Cognito は、AWS Identity and Access Management を使用して設定した OpenID Connect プロバイダーとアイデンティティをリンクすることをサポートしています。

OpenID Connect プロバイダーの追加

OpenID Connect プロバイダーの作成方法については、AWS Identity and Access Management ユーザーガイドの「OpenID Connect (OIDC) ID プロバイダーの作成」を参照してください。

Amazon Cognito とのプロバイダーの関連付け

OIDC ID プロバイダー (IdP) を追加するには
  1. Amazon Cognito コンソール[ID プールの管理] をクリックします。アイデンティティプールを選択します。

  2. [ユーザーアクセス] タブを選択します。

  3. [ID プロバイダーを追加] を選択します。

  4. [OpenID Connect (OIDC)] を選択します。

  5. IdPs の IAM から OIDC ID プロバイダーを選択しますAWS アカウント。新しい SAML プロバイダーを追加する場合は、[新しいプロバイダの作成] を選択して IAM コンソールに移動します。

  6. Amazon Cognito がこのプロバイダーで認証されたユーザーに認証情報を発行するときにリクエストするロールを設定するには、[ロール設定] を設定します。

    1. その IdP のユーザーに、認証済みロールを設定したときに設定したデフォルトロールを割り当てることも、ルール付きのロールを選択することもできます。

      1. [ルールを使用してロールを選択する] を選択した場合、ユーザー認証からのソースクレーム、クレームを比較するオペレータ、このロール選択と一致するおよびロール割り当てが一致したときに割り当てるロールを入力します。別の条件に基づいて追加のルールを作成するには、[別のものを追加] を選択します。

      2. [ロールの解決] を選択します。ユーザーのクレームがルールに合わない場合は、認証情報を拒否するか、認証済みロールの認証情報を発行できます。

  7. Amazon Cognito がこのプロバイダーで認証されたユーザーに認証情報を発行するときに割り当てるプリンシパルタグを変更するには、[アクセスコントロールの属性] を設定します。

    1. プリンシパルタグを適用しない場合は、[非アクティブ] を選択します。

    2. sub および aud クレームに基づいてプリンシパルタグを適用するには、[デフォルトマッピングを使用] を選択します。

    3. プリンシパルタグへの属性の独自のカスタムスキーマを作成するには、[カスタムマッピングを使用] を選択します。次に、タグに表示したい各クレームから取得するタグキーを入力します。

  8. [変更を保存] を選択します。

複数の OpenID Connect プロバイダーを、単一の ID プールと関連付けることができます。

OpenID Connect の使用

ログインして ID トークンを受け取る方法については、プロバイダーのドキュメントを参照してください。

トークンを取得したら、ログインマップにトークンを追加します。プロバイダーの URI をキーとして使用します。

OpenID Connect トークンの検証

初めて Amazon Cognito と統合するときは、InvalidToken 例外を受け取る場合があります。Amazon Cognito が OpenID Connect (OIDC) トークンを検証する方法を理解しておくことが重要です。

注記

https://tools.ietf.org/html/rfc7523 で規定されているように、Amazon Cognito では、システム間のクロックスキューを処理するために 5 分の猶予期間が提供されます。

  1. iss パラメータは、ログインマップで使われるキー (login.provider.com など) と一致する必要があります。

  2. 署名が有効である必要があります。署名は、RSA パブリックキーを通じて検証可能である必要があります。

  3. 証明書の公開キーのフィンガープリントは、OIDC プロバイダーを作成したときに IAM で設定したフィンガープリントと一致します。

  4. azp パラメータが存在する場合は、OIDC プロバイダーでリストされたクライアント ID に対してこの値を確認します。

  5. azp パラメータが存在しない場合は、OIDC プロバイダーでリストされたクライアント ID に対して aud パラメータを確認します。

ウェブサイトの jwt.io は、これらの値を検証するためのトークンをデコードするための貴重なリソースです。

Android

Map<String, String> logins = new HashMap<String, String>(); logins.put("login.provider.com", token); credentialsProvider.setLogins(logins);

iOS - Objective-C

credentialsProvider.logins = @{ "login.provider.com": token }

iOS - Swift

Amazon Cognito に OIDC ID トークンを提供するには、AWSIdentityProviderManager プロトコルを実装します。

logins メソッドを実装する際は、設定した OIDC プロバイダー名を含むディクショナリを返します。次のコード例に示すように、このディクショナリはキーとして機能し、認証されたユーザーからの現在の ID トークンが値として機能します。

class OIDCProvider: NSObject, AWSIdentityProviderManager { func logins() -> AWSTask<NSDictionary> { let completion = AWSTaskCompletionSource<NSString>() getToken(tokenCompletion: completion) return completion.task.continueOnSuccessWith { (task) -> AWSTask<NSDictionary>? in //login.provider.name is the name of the OIDC provider as setup in the Amazon Cognito console return AWSTask(result:["login.provider.name":task.result!]) } as! AWSTask<NSDictionary> } func getToken(tokenCompletion: AWSTaskCompletionSource<NSString>) -> Void { //get a valid oidc token from your server, or if you have one that hasn't expired cached, return it //TODO code to get token from your server //... //if error getting token, set error appropriately tokenCompletion.set(error:NSError(domain: "OIDC Login", code: -1 , userInfo: ["Unable to get OIDC token" : "Details about your error"])) //else tokenCompletion.set(result:"result from server id token") } }

AWSCognitoCredentialsProvider をインスタンス化するときに、コンストラクターで AWSIdentityProviderManager の値として identityProviderManager を実装するクラスを渡します。詳細については、AWSCognitoCredentialsProviderリファレンスページに移動し、initWithRegionタイプ:identityPoolId:identityProviderManager を選択します。

JavaScript

AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: 'IDENTITY_POOL_ID', Logins: { 'login.provider.com': token } });

Unity

credentials.AddLogin("login.provider.com", token);

Xamarin

credentials.AddLogin("login.provider.com", token);