【问题标题】:Can i use AWS cognito to provide a open id connect endpoint?我可以使用 AWS cognito 来提供开放 id 连接端点吗?
【发布时间】:2018-05-19 18:28:36
【问题描述】:

我想使用 AWS cognito 作为 OpenId 连接提供商。我的 AWS cognito IDP 将调用我的另一个 OpenId 提供商来对用户进行身份验证。然后它将创建自己的新令牌并作为自己的令牌移交给调用者。

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

用户案例

  • 用户通过 My AWS IDP 提供商进行身份验证
  • 我的 IDP 提供商向 Google 的 IDP 提供商验证用户身份
  • 我的 IDP 对 Google IDP 返回的令牌进行解码。
  • 我的 IDP 创建新令牌并添加其他声明。
  • 我的 IDP 将我的 JWT 交给用户。

问题

  • 这在 AWS cognito 中是否可行?
  • AWS 用户池是否公开 OpenID 连接端点?

【问题讨论】:

    标签: oauth amazon-cognito openid-connect


    【解决方案1】:

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

    权限公式为:

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

    您可以通过检查元数据 URL 来验证是否存在某些内容

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

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

    【讨论】:

      【解决方案2】:

      提供有关 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
      

      响应类型

      上述端点返回以下三种response_type:

      "response_types_supported":["code","token","token id_token"]
      
      • 代码:在https://www.rfc-editor.org/rfc/rfc6749#section-11.3.2 中定义 - 这对我们有用,但仅当域指定如下时。

      • token: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"}
      

      错误消息并未表明请求有什么问题,因此这似乎是 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-Initiated Logout 描述了注销端点的工作方式。如果尝试手动将注销端点传递给 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,但没有退出选项。

      云形成

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

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

      总结

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

      【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-11-01
        • 2018-08-29
        • 2020-01-18
        • 2020-09-30
        • 1970-01-01
        • 2018-01-15
        • 2014-11-10
        • 1970-01-01
        • 2020-11-25
        相关资源
        最近更新 更多