重定向和授权端点 - Amazon Cognito

重定向和授权端点

/oauth2/authorize 端点是支持两个重定向目标的重定向端点。如果您在 URL 中包括 identity_provideridp_identifier 参数,则它会静默地将用户重定向到该身份提供者(IdP)的登录页面。否则,它会使用您在请求中包括的相同 URL 参数重定向到 登录端点

授权端点将会重定向到托管 UI 或 IdP 登录页面。此端点上的用户会话的目的地是您的用户必须直接在其浏览器中与之交互的网页。

要使用 authorize 端点,请在 /oauth2/authorize 上使用为您的用户池提供有关以下用户池详细信息的信息的参数调用用户的浏览器。

  • 您希望登录到的应用程序客户端。

  • 您希望最终到达的回调 URL。

  • 您希望在用户的访问令牌中请求的 OAuth 2.0 范围。

  • (可选)您希望用于登录的第三方 IdP。

您还可以提供 Amazon Cognito 用来验证传入声明的 statenonce 参数。

GET /oauth2/authorize

/oauth2/authorize 端点只支持 HTTPS GET。您的应用程序通常在用户的浏览器中发起此请求。您只能通过 HTTPS 向 /oauth2/authorize 端点发出请求。

您可以在 OpenID Connect(OIDC)标准的授权端点中详细了解授权端点的定义。

请求参数

response_type

(必需)响应类型。必须为 codetoken

response_typecode 的成功请求返回授权代码授予。授权代码授予是 Amazon Cognito 附加到重定向 URL 的 code 参数。您的应用程序可以将包含 令牌端点的代码交换为访问权限、ID 和刷新令牌。作为安全最佳实践,以及要为您的用户接收刷新令牌,请在您的应用程序中使用授权代码授予。

response_typetoken 的成功请求返回隐式授予。隐式授予是 Amazon Cognito 附加到您的重定向 URL 的 ID 和访问令牌。隐式授予的安全性较差,因为它会向用户公开令牌和潜在的识别信息。您可以在应用程序客户端的配置中停用对隐式授予的支持。

client_id

(必需)应用程序客户端 ID。

client_id 的值必须是您在其中发出请求的用户池中应用程序客户端的 ID。您的应用程序客户端必须支持由 Amazon Cognito 本地用户或至少一个第三方 IdP 登录。

redirect_uri

(必需)在 Amazon Cognito 授权用户之后,身份验证服务器将浏览器重定向到的 URL。

重定向统一资源标识符(URI)必须具有以下属性:

  • 必须是绝对 URI。

  • 您必须已经将 URI 预注册到客户端。

  • 不能包含片段组件。

请参阅 OAuth 2.0 – 重定向端点

Amazon Cognito 要求您的重新导向 URI 使用 HTTPS,但 http://localhost 除外,您可以将其设置为回调 URL 以进行测试。

Amazon Cognito 还支持应用程序回调 URL,如 myapp://example

state

(可选,推荐)当应用程序向请求添加 state 参数时,如果 /oauth2/authorize 端点重新导向您的用户,则 Amazon Cognito 将此参数的值返回给您的应用程序。

将此值添加到您的请求中以防止 CSRF 攻击。

不能将 state 参数的值设置为 URL 编码的 JSON 字符串。要在 state 参数中传递与此格式匹配的字符串,请将该字符串编码为 base64,然后在应用程序中对其进行解码。

identity_provider

(可选)添加此参数以绕过托管 UI 并将您的用户重定向到提供商登录页面。identity_provider 参数的值是出现在您的用户池中的身份提供商(IdP)的名称。

  • 对于社交提供者,您可以使用 identity_providerFacebookGoogleLoginWithAmazonSignInWithApple

  • 对于 Amazon Cognito 用户池,使用值 COGNITO

  • 对于 SAML 2.0 和 OpenID Connect(OIDC)身份提供者(IdP),使用您在用户池中分配给 IdP 的名称。

idp_identifier

(可选)添加此参数以重定向到具有 identity_provider 名称的替代名称的提供者。您可以从 Amazon Cognito 控制台的登录体验选项卡中为您的 SAML 2.0 和 OIDC IdP 输入标识符。

scope

(可选)可以是任何系统预留范围或与客户端关联的自定义范围的组合。范围必须以空格分隔。系统预留范围为 openidemailphoneprofileaws.cognito.signin.user.admin。使用的任意范围必须与客户端关联,否则将在运行时忽略。

如果客户端不请求任何范围,则身份验证服务器使用与客户端关联的所有范围。

如果请求 openid 范围,则只返回 ID 令牌。如果请求 aws.cognito.signin.user.admin 范围,则访问令牌只能用于 Amazon Cognito 用户池。如果同时请求了 phone 范围,则只能请求 emailprofileopenid 范围。这些范围控制进入 ID 令牌中的声明。

code_challenge_method

(可选)用于生成质询的哈希协议。PKCE RFC 定义两个方法:S256 和 plain;但是,Amazon Cognito 身份验证服务器仅支持 S256。

code_challenge

(可选)从 code_verifier 生成的代码交换的证明密钥(PKCE)质询。有关更多信息,请参阅 在授权代码授予中使用 PKCE

仅当您指定 code_challenge_method 参数时是必需的。

nonce

(可选)您可以添加到请求中的随机值。您提供的 nonce 值包含在 Amazon Cognito 发出的 ID 令牌中。为了防范重播攻击,您的应用程序可以检查 ID 令牌中的 nonce 声明并将其与您生成的声明进行比较。有关 nonce 声明的更多信息,请参阅《OpenID Connect 标准》中的 ID token validation(ID 令牌验证)。

login_hint

要传递给授权服务器的用户名提示。您可以从用户那里收集用户名、电子邮件地址或电话号码,并允许目的地提供者预先填入用户的登录名。当您向 oauth2/authorize 端点提交 login_hint 参数,而没有提交 idp_identifieridentity_provider 参数时,托管 UI 会使用您的提示值填写用户名字段。您也可以将此参数传递给 登录端点 并自动填入用户名值。

当您的授权请求调用到 OIDC IdP 或 Google 的重定向时,Amazon Cognito 会在请求中向该第三方授权机构添加一个 login_hint 参数。您无法将登录提示转发给 SAML、Apple、Login With Amazon 或 Facebook(Meta)IdP。

具有正向响应的示例请求

以下示例说明了向 /oauth2/authorize 端点发出的 HTTP 请求的格式。

授予授权代码

这是授权代码授予的示例请求。

示例:GET 请求

以下请求会启动会话,以便检索您的用户在 redirect_uri 目的地传递给应用程序的授权代码。该会话请求的范围包括用户属性和对 Amazon Cognito 自助服务 API 操作的访问权限。

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=code& client_id=1example23456789& redirect_uri=https://www.example.com& state=abcdefg& scope=openid+profile+aws.cognito.signin.user.admin
示例:响应

Amazon Cognito 身份验证服务器使用授权代码和状态重新导向回您的应用程序。授权代码的有效期为五分钟。

HTTP/1.1 302 Found Location: https://www.example.com?code=a1b2c3d4-5678-90ab-cdef-EXAMPLE11111&state=abcdefg

具有 PKCE 的授权代码授予

这是使用 PKCE 进行授权代码授予的示例请求。

示例:GET 请求

以下请求为上一个请求添加 code_challenge 参数。要完成令牌代码的交换,必须在向 /oauth2/token 端点发出的请求中包括 code_verifier 参数。

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=code& client_id=1example23456789& redirect_uri=https://www.example.com& state=abcdefg& scope=aws.cognito.signin.user.admin& code_challenge_method=S256& code_challenge=a1b2c3d4...
示例:响应

身份验证服务器将授权代码和状态重定向回您的应用程序。代码和状态必须在查询字符串参数中返回,而不是在片段中:

HTTP/1.1 302 Found Location: https://www.example.com?code=a1b2c3d4-5678-90ab-cdef-EXAMPLE11111&state=abcdefg

不带 openid 范围的令牌授予

这是一个生成隐式授权并将 JWT 直接返回到用户会话的示例请求。

示例:GET 请求

以下请求是从您的授权服务器请求隐式授权。来自 Amazon Cognito 的访问令牌授权自助服务 API 操作。

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=token& client_id=1example23456789& redirect_uri=https://www.example.com& state=abcdefg& scope=aws.cognito.signin.user.admin
示例:响应

Amazon Cognito 授权服务器使用访问令牌重新导向回您的应用程序。由于未请求 openid 范围,Amazon Cognito 不会返回 ID 令牌。此外,Amazon Cognito 不会在此流程中返回刷新令牌。Amazon Cognito 在片段中,而不是在查询字符串中返回访问令牌和状态:

HTTP/1.1 302 Found Location: https://YOUR_APP/redirect_uri#access_token=ACCESS_TOKEN&token_type=bearer&expires_in=3600&state=STATE

具有 openid 范围的令牌授予

这是一个生成隐式授权并将 JWT 直接返回到用户会话的示例请求。

示例:GET 请求

以下请求是从您的授权服务器请求隐式授权。来自 Amazon Cognito 的访问令牌授权对用户属性和自助服务 API 操作的访问。

GET https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/authorize? response_type=token& client_id=1example23456789& redirect_uri=https://www.example.com& state=abcdefg& scope=aws.cognito.signin.user.admin+openid+profile
示例:响应

授权服务器重定向回您的应用程序,带有访问令牌和 ID 令牌(因为包括了 openid 范围):

HTTP/1.1 302 Found Location: https://www.example.com#id_token=eyJra67890EXAMPLE&access_token=eyJra12345EXAMPLE&token_type=bearer&expires_in=3600&state=abcdefg

负向响应的示例

Amazon Cognito 可能会拒绝您的请求。失败的请求附带 HTTP 错误代码和相关描述,您可以使用这些信息来更正请求参数。以下是负向响应的示例。

  • 如果 client_idredirect_uri 有效,但请求参数格式不正确,身份验证服务器会将该错误重定向到客户端的 redirect_uri 并在 URL 参数中附加错误消息。以下是错误格式的示例。

    • 该请求不包括 response_type 参数。

    • 授权请求提供了 code_challenge 参数,但没有提供 code_challenge_method 参数。

    • code_challenge_method 参数的值不是 S256

    以下是使用了错误格式的示例请求的响应。

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request
  • 如果客户端在 response_type 中请求 codetoken,但没有这些请求的权限,则 Amazon Cognito 授权服务器将 unauthorized_client 返回到客户端的 redirect_uri,如下所示:

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=unauthorized_client
  • 如果客户端请求范围未知、格式错误或者无效,则 Amazon Cognito 授权服务器会将 invalid_scope 返回到客户端的 redirect_uri,如下所示:

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_scope
  • 如果服务器中有意外的错误,则授权服务器会将 server_error 返回到客户端的 redirect_uri。由于 HTTP 500 错误不会发送到客户端,所以在用户的浏览器中不会显示该错误。授权服务器返回以下错误。

    HTTP 1.1 302 Found Location: https://client_redirect_uri?error=server_error
  • 当 Amazon Cognito 通过联合身份验证向第三方 IdP 进行身份验证时,Amazon Cognito 可能会遇到以下连接问题:

    • 如果从 IdP 处请求令牌时连接超时,身份验证服务器会将该错误重定向到客户端的 redirect_uri,如下所示:

      HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Timeout+occurred+in+calling+IdP+token+endpoint
    • 如果在调用 jwks_uri 端点进行 ID 令牌验证时连接超时,身份验证服务器会重定向到客户端的 redirect_uri,并出现如下所示的错误:

      HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=error_description=Timeout+in+calling+jwks+uri
  • 通过联合身份验证向第三方 IdP 进行身份验证时,提供者可能会返回错误响应。这可能是由于配置错误或其他原因而造成,例如以下原因:

    • 如果从其他提供商处收到错误响应,身份验证服务器会将该错误重定向到客户端的 redirect_uri,如下所示:

      HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=[IdP name]+Error+-+[status code]+error getting token
    • 如果从 Google 收到错误响应,身份验证服务器会将该错误重定向到客户端的 redirect_uri,如下所示:

      HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Google+Error+-+[status code]+[Google-provided error code]
  • 如果 Amazon Cognito 在连接到外部 IdP 时遇到通信异常,则身份验证服务器会重定向到客户端的 redirect_uri,并显示以下错误消息:

    • HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Connection+reset
    • HTTP 1.1 302 Found Location: https://client_redirect_uri?error=invalid_request&error_description=Read+timed+out