首页 > 解决方案 > Cognito 用户池 - 通过 REST API 使用刷新令牌

问题描述

我们正在使用 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 Bad Requesterrorinvalid_grant. 这发生在 Flutter 代码和 Postman 请求中。两者都通过将上述内容包含在 x-www-form-urlencoded 正文中来提出请求。

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

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

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

有人会有什么想法吗?

谢谢

标签: amazon-web-servicesflutteramazon-cognito

解决方案


以下卷曲对我有用:

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 调用的问题。


推荐阅读