【问题标题】:TOKEN endpoint returns invalid_client without client secretTOKEN 端点返回没有客户端密码的 invalid_client
【发布时间】:2019-07-01 20:50:33
【问题描述】:

我在使用 Amazon Cognito 中的授权代码流时遇到问题。我正在尝试构建的工作流程如下:

  1. 用户使用内置的 Cognito UI 进行身份验证。
  2. Cognito 使用授权码重定向回来。
  3. 我将代码发送到使用 /oauth2/token 端点交换令牌的服务器。

我创建了一个没有客户端密码的客户端。我使用 Cognito UI 进行身份验证,取回代码,然后使用 Postman 发送以下内容:

URL: https://MY-DOMAIN/oauth2/token
Method: POST
Headers: 
Content-Type: application/x-www-form-urlencoded
Body:
  grant_type=authorization_code&
  client_id=<my-client-id>&
  code=<code-from-cognito-ui>&
  redirect_uri=<my-redirect-url>

我不使用授权,因为没有客户端密码。

作为回报,我收到:

Code: 400
Body: { "error": "invalid_client" }

允许应用程序客户端在 AWS Cognito 控制台中授予授权代码。

【问题讨论】:

  • 运气好吗?我也遇到了同样的问题
  • 我在一段时间后重复了相同的步骤,它们奏效了。我不知道/不记得确切原因,最初可能错过了一些东西。但是,如果您附上邮递员/您正在使用的其他实用程序的屏幕截图,我可以检查可能有什么问题。
  • 我终于放弃并创建了一个带有秘密的新 Cognito 客户端应用程序,事情也开始为我工作了。
  • 我也遇到过这种问题。问题是使用 client_secret 创建客户端。您应该通过取消选中“生成客户端密码”选项来创建您的客户端。因为授权代码流在客户端工作,这意味着您的客户端必须使用公共类型创建。效果很好。

标签: amazon-web-services amazon-cognito


【解决方案1】:

不过,文档中的任何地方似乎都没有提到这一点, 如果您使用 client_secret 创建了客户端应用程序,则应将 client_secret 添加到参数中以使其正常工作。

curl -X POST \
'https://<Cognito User Pool Domain>/oauth2/token?
grant_type=authorization_code&
code=8a24d2df-07b9-41e1-bb5c-c269e87838df&
redirect_uri=http://localhost&
client_secret=xcxxxs2r234XXXXXX&
client_id=55pb79dl8gm0i1ho9hdrXXXXXX' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Content-Type: application/x-www-form-urlencoded'

或者您需要使用“generate client_secret”= false 创建应用程序。 此外,默认情况下,用户池会为您的应用生成客户端密码。

【讨论】:

    【解决方案2】:

    在您提到的问题的 cmets 中:

    一段时间后重复相同的步骤,他们工作了。

    我偶然发现了相同或相似的问题。我的解决方案是不使用以前登录的会话。我必须退出或打开隐身/私人浏览器会话并重新登录才能解决问题。

    问题中所有参数根据documentation有效。

    【讨论】:

      【解决方案3】:

      我会评论其他解决方案,但还没有足够的代表。

      为将来遇到此问题的任何人提供一些额外信息:

      不仅不需要授权标头...它不允许

      说“不需要”让我相信这是可选的。事实上,如果你在请求中传递它,我发现响应通常会像 OP 所描述的那样:

      Code: 400
      Body: { "error": "invalid_client" }
      

      【讨论】:

        【解决方案4】:

        问题在于授权标头。

        当使用没有客户端密码的客户端时,不需要授权标头。

        例子:

        curl -X POST \
        'https://<Cognito User Pool Domain>/oauth2/token?
        grant_type=authorization_code&
        code=8a24d2df-07b9-41e1-bb5c-c269e87838df&
        redirect_uri=http://localhost&
        client_id=55pb79dl8gm0i1ho9hdrXXXXXX&scope=openid+email' \
        -H 'Accept-Encoding: gzip, deflate' \
        -H 'Content-Type: application/x-www-form-urlencoded'
        

        【讨论】:

        • 你能扩展一下这个答案——也许是一些代码?
        • 已更新示例。
        • 是的!就是这个。非常感谢
        • 同意@h-kippo。虽然发布的答案没有错,但这不是正确的答案。他下面的答案是正确的。
        • 感谢我的邮递员配置中缺少此信息以检索访问令牌。在邮递员中有一个下拉选项“客户端身份验证”,带有“作为基本身份验证标头发送”或“在正文中发送客户端凭据”。当它被添加到标题时,我也得到了“invalid_client”。但是我的 OAuth2 流程没有客户端凭据。请求正文grant_type=authorization_code&amp;code=&lt;Code&gt;&amp;redirect_uri=&lt;MyRedirect&gt;&amp;code_verifier=&lt;CodeVerifier&gt;&amp;client_id=&lt;MyCognitoClientId&gt;&amp;client_secret=
        【解决方案5】:

        我在 iOS 上使用 Cognito(不是放大)时遇到了类似的问题,但我发现我实际上需要发送 nil(对于 swift)。

        我不确定这是否会对您的情况有所帮助,但这是我在 Swift 中所拥有的:

        @objc func config(_ call: CAPPluginCall) {
            let appClientId = "myclientid";
            let scopes = Set<String>(["openid", "email"]);
            let signInRedirectUri = "com.myappurl://signin";
            let signOutRedirectUri = "com.myappurl://signout";
            let webDomain = "https://[myappdomain].auth.us-east-2.amazoncognito.com";
        
            // NOTICE my nil here for appClientSecret, if I used "" it would throw the error you are seeing
            let config = AWSCognitoAuthConfiguration(appClientId: appClientId, appClientSecret: nil, scopes: scopes, signInRedirectUri: signInRedirectUri, signOutRedirectUri: signOutRedirectUri, webDomain: webDomain);
        
            AWSCognitoAuth.registerCognitoAuth(with: config, forKey: "AWSCognito")
            call.resolve()
        }
        

        它可能无法准确回答您遇到的情况,但这对我来说是消除可怕错误invalid_client 的方法。

        【讨论】:

          猜你喜欢
          • 2022-06-25
          • 2017-11-28
          • 2020-05-18
          • 1970-01-01
          • 1970-01-01
          • 2015-02-20
          • 2016-03-02
          • 2018-05-19
          • 2021-11-10
          相关资源
          最近更新 更多