Amazon Cognito
開発者ガイド

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

OpenID Connect は、数多くのログインプロバイダーによってサポートされている、認証のためのオープンスタンダードです。Amazon Cognito は、AWS Identity and Access Management を介して設定される OpenID Connect プロバイダーと ID のリンクをサポートしています。

OpenID Connect プロバイダーの追加

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

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

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

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

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

OpenID Connect の使用

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

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

OpenID Connect トークンの検証

最初に Amazon Cognito と統合されたときに、InvalidToken の例外を受け取る場合があります。Amazon Cognito が OpenID Connect トークンを検証する方法を理解することが重要です。

  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 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);