Amazon Cognito
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Open ID Connect 提供商 (身份池)

OpenID Connect 是一种关于身份验证的开放标准,受多个登录提供商支持。Amazon Cognito 支持将身份与通过 AWS Identity and Access Management 配置的 OpenID Connect 提供商相关联。

添加 OpenID Connect 提供商

有关如何创建 OpenID Connect 提供商的信息,请参阅 IAM 文档

将提供商与 Amazon Cognito 关联

在 IAM 控制台中创建 OpenID Connect 提供商后,您可以将其与身份池关联。配置的所有提供商将显示在 OpenID Connect 提供商标头下 Amazon Cognito 控制台中的“Edit Identity Pool”屏幕上。

 外部提供商增强型身份验证流程

您可以将多个 OpenID Connect 提供商与一个身份池关联。

使用 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 协议。

在实施 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 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 参考页面,并选择 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);