本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
OpenID Connect
添加 OpenID Connect 提供商
有关如何创建 OpenID Connect 提供者的信息,请参阅《AWS Identity and Access Management 用户指南》中的创建 OpenID Connect(OIDC)身份提供者。
将提供商与 Amazon Cognito 关联
添加 OIDC 身份提供者(IdP)
-
从 Amazon Cognito 控制台
中选择身份池。选择身份池。 -
选择用户访问选项卡。
-
选择添加身份提供者。
-
选择 OpenID Connect(OIDC)。
-
从您的 IAM 中选择一个 OIDC 身份提供商 IdPs 。 AWS 账户如果您想添加新的 SAML 提供者,请选择创建新的提供者以导航到 IAM 控制台。
-
要设置 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时请求的角色,请配置角色设置。
-
您可以为该 IdP 中的用户分配您在配置经过身份验证的角色时设置的原定设置角色,也可以使用规则选择角色。
-
如果您选择使用规则选择角色,请输入用户身份验证中的来源声明、您要用来比较声明的运算符、导致与该角色选择匹配的值,以及当角色分配匹配时要分配的角色。选择添加其他,以根据不同的条件创建其他规则。
-
选择角色解析。当用户的声明与您的规则不匹配时,您可以拒绝凭证或为经过身份验证的角色颁发凭证。
-
-
-
要更改 Amazon Cognito 在向通过该提供者进行身份验证的用户颁发凭证时分配的主体标签,请配置访问控制属性。
-
如果不应用主体标签,请选择非活动。
-
要基于
sub
和aud
声明应用主体标签,请选择使用原定设置映射。 -
要为主体标签创建自己的自定义属性模式,请选择使用自定义映射。然后,对于您要在标签中表示的每个声明,输入要从该声明中获取的标签键。
-
-
选择保存更改。
您可以将多个 OpenID Connect 提供商与一个身份池关联。
使用 OpenID Connect
有关如何登录和接收 ID 令牌的信息,请参阅提供商的文档。
拥有令牌后,将此令牌添加到登录映射。使用提供程序的 URI 作为密钥。
验证 OpenID Connect 令牌
首次与 Amazon Cognito 集成时,您可能会收到 InvalidToken
异常。务必要了解 Amazon Cognito 如何验证 OpenID Connect (OIDC) 令牌。
注意
如此处所述 (https://tools.ietf.org/html/rfc7523
-
iss
参数必须与登录映射使用的密钥匹配(如 login.provider.com)。 -
签名必须有效。签名必须可通过 RSA 公有密钥进行验证。
注意
身份池会将 OIDC IdP 签名密钥的缓存短时间保存。如果您的提供商更改了签名密钥,Amazon Cognito 可能会返回
NoKeyFound
错误,直到此缓存刷新为止。如果您遇到此错误,请等待大约十分钟,让您的身份池刷新签名密钥。 -
证书公钥的指纹与您在创建 OIDC 提供程序时在 IAM 中设置的指纹相匹配。
-
如果
azp
参数存在,请根据您的 OIDC 提供商 IDs 中列出的客户端检查此值。 -
如果
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 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
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);