AWS Cognito; hit / oauth2 / token时发生unauthorized_client错误

时间:2018-05-10 02:39:55

标签: amazon-web-services authentication oauth oauth-2.0 amazon-cognito

到目前为止采取的步骤:

  • 在cognito中设置新用户池
  • 使用无秘密生成应用客户端;我们称之为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是因为“客户端不允许代码授予流程或刷新令牌。”这是令人困惑的,因为我选中了允许客户端使用代码授权流程的方框。

2 个答案:

答案 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'],
  }
}