将 OIDC 提供商设置为身份池 IdP - Amazon Cognito

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 OIDC 提供商设置为身份池 IdP

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

添加 OpenID Connect 提供商

有关如何创建 OpenID Connect 提供者的信息,请参阅《AWS Identity and Access Management 用户指南》中的创建 OpenID Connect(OIDC)身份提供者

将提供商与 Amazon Cognito 关联

添加 OIDC 身份提供者(IdP)
  1. Amazon Cognito 控制台中选择身份池。选择身份池。

  2. 选择用户访问选项卡。

  3. 选择添加身份提供者

  4. 选择 OpenID Connect(OIDC)

  5. 从您的 IAM 中选择一个 OIDC 身份提供商 IdPs 。AWS 账户如果您想添加新的 SAML 提供者,请选择创建新的提供者以导航到 IAM 控制台。

  6. 要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置

    1. 您可以为该 IdP 中的用户分配您在配置经过身份验证的角色时设置的原定设置角色,也可以使用规则选择角色

      1. 如果您选择使用规则选择角色,请输入用户身份验证中的来源声明、您要用来比较声明的运算符、导致与该角色选择匹配的,以及当角色分配匹配时要分配的角色。选择添加其他,以根据不同的条件创建其他规则。

      2. 选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。

  7. 要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性

    1. 如果不应用主体标签,请选择非活动

    2. 要基于 subaud 声明应用主体标签,请选择使用原定设置映射

    3. 要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键

  8. 选择保存更改

您可以将多个 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参考页面并选择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);