OIDC 用户池 IdP 身份验证流程
通过 OpenID Connect(OIDC)登录,您的用户池会自动执行身份提供者(IdP)的授权码登录流程。您的用户使用其 IdP 完成登录后,Amazon Cognito 会在外部提供商的 oauth2/idpresponse 端点收集他们的代码。借助生成的访问令牌,您的用户池查询 IdP userInfo 端点以检索用户属性。然后,您的用户池将收到的属性与您设置的属性映射规则进行比较,并相应地填入用户的配置文件和 ID 令牌。
您在 OIDC 提供者配置中请求的 OAuth 2.0 范围定义了 IdP 向 Amazon Cognito 提供的用户属性。作为一项最佳安全实践,请仅请求与要映射到用户池的属性相对应的范围。例如,如果您的用户池请求 openid profile,您将获得所有可能的属性,但是如果您请求 openid email
phone_number,则只能获得用户的电子邮件地址和电话号码。您可以将从 OIDC IdP 发出的请求的范围配置为与您在应用程序客户端和用户池身份验证请求中授权和请求的范围不同。
当您的用户使用 OIDC IdP 登录您的应用程序时,您的用户池执行以下身份验证流程。
-
用户访问您的托管登录页面,并选择使用其 OIDC IdP 登录。
-
您的应用程序将用户的浏览器定向到用户池的授权端点。
-
您的用户池将请求重定向到 OIDC IdP 的授权端点。
-
您的 IdP 显示登录提示。
-
在您的应用程序中,用户会话显示 OIDC IdP 的登录提示。
-
用户输入他们的 IdP 凭证,或者为已通过身份验证的会话提供 cookie。
-
在您的用户进行身份验证后,OIDC IdP 将使用授权代码重定向至 Amazon Cognito。
-
用户池将授权码交换为 ID 和访问令牌。当您将 IdP 配置为范围
openid时,Amazon Cognito 将接收访问令牌。ID 令牌中的声明和userInfo响应由 IdP 配置中的其他范围确定,例如profile和email。 -
您的 IdP 发放请求的令牌。
-
用户池根据您的 IdP 配置中的发布者 URL 确定指向 IdP
jwks_uri端点的路径,并从 JSON Web 密钥集(JWKS)端点请求令牌签名密钥。 -
IdP 从 JWKS 端点返回签名密钥。
-
用户池根据令牌中的签名和到期数据验证 IdP 令牌。
-
用户池使用访问令牌授权向 IdP
userInfo端点的请求。IdP 根据访问令牌范围使用用户数据进行响应。 -
用户池将 ID 令牌和 IdP 的
userInfo响应与用户池中的属性映射规则进行比较。这样会将映射的 IdP 属性写入用户池配置文件属性。 -
Amazon Cognito 颁发应用程序持有者令牌,可能包括身份令牌、访问令牌和刷新令牌。
-
您的应用程序处理用户池令牌并将用户登录。
注意
Amazon Cognito 会取消未在 5 分钟内完成的身份验证请求,并将用户重定向到托管登录。页面随即显示 Something
went wrong 错误消息。
OIDC 是基于 OAuth 2.0 的身份层,它指定 IdP 向 OIDC 客户端应用程序(信赖方)颁发的 JSON 格式的 (JWT) 身份令牌。有关将 Amazon Cognito 添加为 OIDC 信赖方的信息,请参阅适用于您 OIDC IdP 的文档。
当用户使用授权码授予进行身份验证时,用户池将返回 ID、访问权限和刷新令牌。ID 令牌是用于身份管理的标准 OIDC
用户池如何处理来自 OIDC 提供者的声明
当用户通过第三方 OIDC 提供者完成登录时,托管登录会从 IdP 检索授权码。用户池会与 IdP 的 token 端点交换访问令牌和 ID 令牌的授权码。用户池不会将这些令牌传递给用户或应用程序,而是使用它们来构建用户配置文件,其中包含用户池在声明中以其自己的令牌表示的数据。
Amazon Cognito 不会独立验证访问令牌。相反,它会从提供者 userInfo 端点请求用户属性信息,如果令牌无效,则该请求会被拒绝。
Amazon Cognito 通过以下检查来验证提供者 ID 令牌:
-
检查提供者是否使用以下集合中的算法对令牌进行了签名:RSA、HMAC、椭圆曲线。
-
如果提供者使用非对称签名算法对令牌进行了签名,请检查令牌
kid声明中的签名密钥 ID 是否在提供者jwks_uri端点上列出。Amazon Cognito 会为其处理的每个 IdP ID 令牌刷新 IdP 配置中的 JWKS 端点的签名密钥。 -
根据提供者元数据,将 ID 令牌签名与预期的签名进行比较。
-
将
iss声明与为 IdP 配置的 OIDC 颁发者进行比较。 -
比较
aud声明是否与在 IdP 上配置的客户端 ID 相匹配,或者,如果aud声明中有多个值,则声明包含所配置的客户端 ID。 -
检查
exp声明中的时间戳不早于当前时间。
用户池会验证 ID 令牌,然后尝试使用提供者访问令牌向提供者 userInfo 端点发出请求。此请求检索访问令牌中的范围授权它读取的任何用户配置文件信息。然后,用户池将搜索您在用户池中根据需要设置的用户属性。您必须在提供者配置中为必需的属性创建属性映射。用户池会检查提供者 ID 令牌和 userInfo 响应。用户池将所有与映射规则匹配的声明写入用户池用户配置文件中的用户属性。用户池会忽略与映射规则匹配、但不是必需且在提供者的声明中找不到的属性。