【问题标题】:Cognito User Pool - using Refresh Tokens through REST APICognito 用户池 - 通过 REST API 使用刷新令牌
【发布时间】:2021-12-07 07:44:48
【问题描述】:

我们正在使用 Cognito 用户池与我们公司的 IDP 的 SAML 联合,以使用 Flutter 前端对我们系统中的用户进行身份验证。

我们已经设置了验证码流程,可以成功地获取一个验证码,并使用这个验证码从 oauth2 端点获取令牌。但是,我正在努力使用刷新代码获取刷新的令牌。

具体来说,我通过以下参数向 ../oauth2/token 端点发出请求:

grant_type: refresh_token

client_id: {client id - same id used to request initial code and token set}

refresh_token: {refresh token obtained from above request}

这似乎遵循 AWS 文档(我正在关注 https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html)和其他问题的建议。但是,在拨打此电话时,我收到 400 错误请求,其中 errorinvalid_grant。这发生在 Flutter 代码和 Postman 请求中。两者都通过将上述内容包含在 x-www-form-urlencoded 正文中来提出请求。

AWS 应用程序客户端未启用密钥,并且用户池未设置为记住设备,因此我查看的其他问题似乎没有涵盖它(例如 Cognito User Pool: How to refresh Access Token using Refresh Token)。应用客户端也设置为启用基于刷新令牌的身份验证。

查看 AWS 文档,invalid_grant 在刷新令牌过期时发生。但是,该应用程序客户端的刷新令牌的有效期设置为 30 天......并且上述请求是在令牌发出几分钟后发出的。

我知道有一个用于 Amplify 的 Flutter SDK,但我们主要使用 API 调用和 WebView。如果我能提供帮助,我不想说我们需要再次重建身份验证流程。

有人有什么想法吗?

谢谢

【问题讨论】:

  • 在授权标头中传递客户端密码? Authorization: Basic asdxxxxxxxxxxxxx。您不应该为公共客户生成秘密,但如果您已经生成,则需要传入。
  • @AndrewGillis 应用程序客户端没有生成任何秘密......我能做的最好的就是传递客户端 ID,但我认为只有在生成秘密时才需要?

标签: amazon-web-services flutter amazon-cognito


【解决方案1】:

以下 curl 适合我:

curl --location --request POST 'https://{{domain}}.auth.us-east-1.amazoncognito.com/oauth2/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'scope={{custom_scope}}' \
--data-urlencode 'client_id={{client_id}}' \
--data-urlencode 'refresh_token={{refresh_token}}'

我认为范围不是必需的。

我的建议是重新审视 SDK 的想法。如果访问令牌已过期,SDK 将向您介绍自动创建访问令牌等问题。如果不使用,需要自己监控过期时间。这不仅仅是简单 API 调用的问题。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2016-09-23
    • 2016-12-30
    • 2018-08-14
    • 2019-01-24
    • 2014-11-02
    • 2015-03-05
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多