我在Amazon Cognito中的授权代码流程上遇到困难。我尝试构建的工作流程如下:
我创建了一个没有客户端机密的客户端。我使用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控制台中允许向应用程序客户端授予授权代码。
答案 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" }