Open ID Connect プロバイダー (ID プール) - Amazon Cognito

Open ID Connect プロバイダー (ID プール)

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

OpenID Connect プロバイダーの追加

OpenID Connect プロバイダーを作成する方法については、IAM のドキュメントを参照してください。

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

IAM コンソールで OpenID Connect プロバイダーを作成したら、ID プールと関連付けることができます。設定されたすべてのプロバイダーは、Amazon Cognito コンソールの [OpenID Connect Providers] (OpenID Connect プロバイダー) ヘッダーの下にある [Edit Identity Pool] (ID プールの編集) 画面に表示されます。


        外部プロバイダーの拡張認証フロー

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

OpenID Connect の使用

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

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

OpenID Connect トークンの検証

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

注記

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

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

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

  3. パブリックキーをホストする証明書のフィンガープリントは、OpenId Connect プロバイダーでの設定に一致します。

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

  5. azp パラメータが存在しない場合は、OpenId Connect プロバイダーでリストされたクライアント 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 プロトコルを実装します。

ログインメソッドの実装で、構成した 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 をインスタンス化するときに、コンストラクターで identityProviderManager の値として AWSIdentityProviderManager を実装するクラスを渡します。詳細については、AWSCognitoCredentialsProvider リファレンスページに移動し、initWithRegionType: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);