我想将AWS cognito用作OpenId连接提供程序。我的AWS cognito IDP将实习调用我的另一个OpenId提供程序来验证用户身份。然后它将创建新的令牌并将其作为自己的代码移交给调用者。
AWS cognito池内部使用的OpenID提供程序对用户是透明的。用户仅将AWS cognito配置为其IDP提供商。
用户案例
问题
答案 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,但是没有注销的选项。
Cognito Cloudformation支持不完整,并且会如下影响OpenID Connect:
要使用OpenID Connect访问Cognito,请确保指定了域,并仅使用response_type“代码”。无法进行OpenID Connect注销。其他选项违反了OpenID Connect规范,或者被释放而损坏。