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

Ant*_*nko 12 amazon-web-services amazon-cognito

我在使用 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>
Run Code Online (Sandbox Code Playgroud)

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

作为回报,我收到:

Code: 400
Body: { "error": "invalid_client" }
Run Code Online (Sandbox Code Playgroud)

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

Yas*_*gar 16

不过,文档中似乎没有提到这一点,如果您使用 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'
Run Code Online (Sandbox Code Playgroud)

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


Tay*_*ner 8

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

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

不仅不需要 Authorization 标头......而且还不允许

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

Code: 400
Body: { "error": "invalid_client" }
Run Code Online (Sandbox Code Playgroud)


小智 5

问题出在 Authorization 标头上。

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

例子:

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'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我的邮递员配置中缺少此信息来检索访问令牌。在邮递员中,有一个下拉选项“客户端身份验证”,其中包含“作为基本身份验证标头发送”或“在正文中发送客户端凭据”。当它被添加到标头时,我也得到了“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=` (6认同)

Chr*_*ris 1

我在 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()
}
Run Code Online (Sandbox Code Playgroud)

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