【发布时间】: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 错误请求,其中 error 为 invalid_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