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

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

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

OpenID Connect 是许多登录提供程序支持的身份验证开放标准。借助 Amazon Cognito,您可以将身份与您配置的 OpenID Connect 提供商关联起来。AWS Identity and Access Management

添加 OpenID Connect 提供商

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

将提供商与 Amazon Cognito 关联

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

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

  3. 选择添加身份提供者

  4. 选择 OpenID Connect () OIDC

  5. 从您的中选择一个OIDC身份提供商 AWS 账户。IAM IdPs 如果要添加新的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 异常。了解亚马逊 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提供商IDs中列出的客户端检查此值。

  5. 如果azp参数不存在,请根据OIDC提供商IDs中列出的客户端检查该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身份令牌,请实施协议。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);