我可以使用AWS cognito提供开放ID连接端点吗?

use*_*796 19 oauth openid-connect amazon-cognito

我想将AWS cognito用作OpenId连接提供者.我的AWS cognito IDP将实习调用我的另一个OpenId提供程序来验证用户身份.然后它将创建其新令牌并将其作为自己的代码移交给调用者.

AWS cognito池内部使用的OpenID提供程序对用户是透明的.用户仅将AWS cognito配置为其IDP提供者.

用户案例

  • 用户使用My AWS IDP提供程序进行身份验证
  • 我的IDP提供商再次验证用户Googles IDP提供商
  • 我的IDP解码了Google IDP返回的令牌.
  • 我的IDP创建新令牌并添加其他声明.
  • 我的IDP将我的JWT交给用户.

  • 这可能是AWS cognito吗?
  • AWS用户池是否公开OpenID连接端点?

Jim*_*nts 15

Cognito的确提供了ID连接端点,如在此详述博客文章@Badri

权威的公式是:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}
Run Code Online (Sandbox Code Playgroud)

您可以通过检查元数据URL来验证存在的内容

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration
Run Code Online (Sandbox Code Playgroud)

然后,在客户端池设置期间,您可以与其他OIDC提供程序联合,并在应用程序客户端设置中启用OIDC提供程序.哪个应该使您的场景听起来与我想要做的非常相似.但是,博客文章遗漏了一个关键的配置,即为应用程序集成设置域名. 如果您没有配置此域并在答案中链接到解决方案,则此StackOverflow问题会显示您将收到的错误.一旦我设置域名,Badri的代码就适合我.


Gra*_*ett 11

提供有关 Cognito 的 OpenID Connect 支持的更详细答案。

发现端点

Cognito在以下位置公开 OpenID Connect Discovery 端点,如https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest所述:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration
Run Code Online (Sandbox Code Playgroud)

响应类型

上述端点返回以下三个 response_types:

"response_types_supported":["code","token","token id_token"]
Run Code Online (Sandbox Code Playgroud)
  • 代码:在https://tools.ietf.org/html/rfc6749#section-11.3.2 中定义- 这对我们有用,但仅当域指定如下时。

  • 令牌:OpenID Connect 在https://openid.net/specs/openid-connect-core-1_0.html#ImplicitAuthRequest - “注意:虽然 OAuth 2.0 还定义了隐式流的令牌响应类型值, OpenID Connect 不使用此响应类型,因为不会返回 ID 令牌。” - OpenID Connect 库将忽略此响应。

  • token id_token:该值触发重定向到代码为“invalid_request”的错误页面。没有说明什么是无效的请求。AWS 技术支持声称授权端点仅支持“代码”和“令牌”,但不清楚为什么如果不支持则广告此 response_type。

领域

Cognito 提供了指定域的选项,该域将作为 Cognito 端点的主机名前缀。

如果没有指定域,Cognito 将在 OpenID Connect 发现端点公布通用 URL,例如https://cognito-idp.eu-west-2.amazonaws.com/ {userPoolId}/authorize,但所有尝试在这些 URL 返回错误消息:

{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}
Run Code Online (Sandbox Code Playgroud)

错误消息并没有表明请求有什么问题,所以这似乎是 Cognito 中的一个错误。

指定域后,Cognito 将公布包含域前缀的 URL,并且 response_type“代码”按预期返回登录页面。

登出

https://openid.net/specs/openid-connect-session-1_0.html#RPLogout 上的OpenID Connect 会话管理描述了必须如何启动 OpenID Connect 注销,并要求按照https://openid.net/specs/ openid-connect-session-1_0.html#OPMetadata将 end_session_endpoint 参数包含在发现元数据中。

在 Cognito 的情况下,元数据中省略了 end_session_endpoint。

RP-Initiated Logout at https://openid.net/specs/openid-connect-session-1_0.html#RPLogout描述了注销端点的工作原理。如果尝试将注销端点手动传递给 OpenID Connect 客户端实现,注销将失败,如下所示:

{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}
Run Code Online (Sandbox Code Playgroud)

同样,错误消息没有给出错误指示,但是https://docs.aws.amazon.com/cognito/latest/developerguide/logout-endpoint.html上的注销端点描述显示与 OpenID Connect 不兼容。

虽然您可以使用 OpenID Connect 登录 Cognito,但没有退出选项。

云化

Cognito Cloudformation 支持不完整,对 OpenID Connect 的影响如下:

  • 无法使用 Cloudformation 指定域,OpenID Connect 需要该域才能工作。
  • OpenID Connect 需要回调 URL,但不能使用 Cloudformation 设置。

概括

要使用 OpenID Connect 访问 Cognito,请确保指定了域,并且仅使用 response_type “code”。OpenID Connect 注销是不可能的。其他选项违反 OpenID Connect 规范,或者被发布破坏。


小智 4

我在遵循您的用例时遇到了一些麻烦,但我会解释一些可能有帮助的要点。

您可以使用 Cognito 用户池通过 Google 对用户进行身份验证,然后从 Cognito 用户池颁发 JWT 令牌。请参阅开发人员指南

Cognito 用户池目前还不是完整的 OpenID 身份提供商,但这已在我们的路线图中。用户池确实支持 OAuth2.0 流,并且它们确实提供 OpenID 标准 JWT 令牌。