Open ID Connect 提供程序(身份池) - Amazon Cognito
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

Open ID Connect 提供程序(身份池)

OpenID Connect 是许多登录提供程序支持的身份验证开放标准。Amazon Cognito 支持您将身份与您通过 Amazon Identity and Access Management 配置的 OpenID Connect 提供程序相关联。

添加 OpenID Connect 提供商

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

将提供商与 Amazon Cognito 关联

在 IAM 控制台中创建 OpenID Connect 提供程序后,您可以将其与身份池关联。您配置的所有提供程序都将显示在 Amazon Cognito 控制台中 Edit Identity Pool(编辑身份池)屏幕上的 OpenID Connect Providers(OpenID Connect 提供程序)标题下。


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

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

使用 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 参考页面,并选择 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);