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

时间:2017-12-06 00:07:10

标签: oauth amazon-cognito openid-connect

我想将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连接端点?

3 个答案:

答案 0 :(得分:12)

Cognito确实提供了一个OpenId连接端点,详见blog post @Badri

权威的公式是:

https://cognito-idp.{region}.amazonaws.com/{userPoolId}

您可以通过检查元数据网址验证某些内容

来验证
https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration

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

答案 1 :(得分:2)

我在使用您的用例时遇到了一些麻烦,但我会解释一些可能有用的问题。

您可以使用Cognito用户池通过Google对用户进行身份验证,然后从Cognito用户池发出JWT令牌。请参阅Developer Guide

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

答案 2 :(得分:1)

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

发现端点

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

https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/openid-configuration

响应类型

以上端点返回以下三种response_types:

"response_types_supported":["code","token","token id_token"]
  • 代码:在https://tools.ietf.org/html/rfc6749#section-11.3.2中定义-此代码对我们有用,但仅当如下指定域时才可用。

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

  • 令牌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"}

该错误消息并不表示该请求有什么不好,因此这似乎是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的情况。

https://openid.net/specs/openid-connect-session-1_0.html#RPLogout上的

RP发起的注销描述了注销端点的工作方式。如果尝试手动将注销端点传递给OpenID Connect客户端实现,则注销失败如下:

{"code":"BadRequest","message":"The server did not understand the operation that was requested.","type":"client"}

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

虽然您可以使用OpenID Connect登录到Cognito,但是没有注销的选项。

Cloudformation

Cognito Cloudformation支持不完整,并且会如下影响OpenID Connect:

  • 无法使用Cloudformation指定域,并且该域是OpenID Connect正常工作所必需的。
  • OpenID Connect要求使用回调URL,但不能使用Cloudformation设置。

摘要

要使用OpenID Connect访问Cognito,请确保指定了域,并仅使用response_type“代码”。无法进行OpenID Connect注销。其他选项违反了OpenID Connect规范,或者被释放而损坏。