到目前为止采取的步骤:
user_pool_client_id
user_pool_client_id
的用户池客户端设置下,选中“Cognito User Pool”框,添加https://localhost
作为回调并注销网址,选中“授权代码授予”,“隐式授权”和“允许的OAuth范围”user_pool_domain
使用用户名/密码
创建新用户现在,我可以成功地去:
https://{{user_pool_domain}}.auth.us-east-2.amazoncognito.com/oauth2/authorize?response_type=code&client_id={{user_pool_client_id}}&redirect_uri=https%3A%2F%2Flocalhost
这为我提供了一个登录页面,我可以以我的用户身份登录,返回https://localhost/?code={{code_uuid}}
然后我尝试以下方法:
curl -X POST https://{{user_pool_domain}}.auth.us-east-2.amazoncognito.com/oauth2/token -H 'Content-Type: application/x-www-form-urlencoded' -d 'grant_type=authorization_code&redirect_uri=https%3A%2F%2Flocalhost&code={{code_uuid}}&client_id={{user_pool_client_id}}'
但是,这只会返回以下内容:
{"error":"unauthorized_client"}
token endpoint docs表示unauthorized_client
是因为“客户端不允许代码授予流程或刷新令牌。”这是令人困惑的,因为我选中了允许客户端使用代码授权流程的方框。
答案 0 :(得分:3)
一切看起来都不错。我认为可能会抱怨Authorization标头丢失但不确定。你可以尝试一些事情:
1)根据此页面(https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html),您不需要在令牌请求中发送Authorization标头,但可能仍然需要它。您可以尝试仅传递其中的客户端ID(授权[客户端ID])或配置秘密并尝试传递授权[客户端ID:客户端密码],就像它说的那样)。无论如何,使用客户端密钥进行授权代码流通常是有意义的,因为在此流程中,有一个服务器端组件可以安全地处理令牌交换。
2)尝试使用隐式流来查看是否有效。 Implicit Flow对于没有服务器端组件的单页应用程序有意义。为此,不需要客户秘密。
答案 1 :(得分:0)
如果您正在使用 amplify 并在 CLI 之外对其进行配置,而其他答案对您不起作用,那么您可以尝试的最后一个解决方法是确保您拥有 responseType: 'token' 如果您使用的是隐式流。为我修复了一些问题。
Auth: {
oauth: {
domain : 'your-app.auth.your-region.amazoncognito.com',
redirectSignIn: environment.cognito.oauthCallbackLogin,
redirectSignOut: environment.cognito.oauthCallbackLogout,
responseType: 'token',
scope : ['email', 'openid', 'profile'],
}
}