TOKEN端点返回没有客户端机密的invalid_client

时间:2019-02-07 16:52:32

标签: amazon-web-services amazon-cognito

我在Amazon Cognito中的授权代码流程上遇到困难。我尝试构建的工作流程如下:

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

我创建了一个没有客户端机密的客户端。我使用Cognito用户界面进行身份验证,获取代码,然后使用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控制台中允许向应用程序客户端授予授权代码。

5 个答案:

答案 0 :(得分:4)

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

ClientModel

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

答案 1 :(得分:3)

问题出在授权标头上。

使用不带客户端机密的客户端时,不需要授权标头。

示例:

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'

答案 2 :(得分:1)

在您提到的问题的评论中:

一段时间后重复相同的步骤,它们起作用了。

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

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

答案 3 :(得分:0)

在iOS上使用Cognito时(没有放大),我遇到了类似的问题,但我发现我需要实际发送nil(以便迅速)。

我不确定这是否能帮助您解决问题,但这就是我在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

答案 4 :(得分:0)

我会评论其他解决方案,但代表还不够。

作为将来遇到此问题的任何人的一些其他信息:

不仅不需要Authorization标头...它是不允许

说“不需要”使我相信它是可选的。实际上,如果沿着请求传递它,我发现响应通常是OP所描述的:

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