无UI M2M场景下获取AWS Cognito刷新令牌遇请求无效问题
问题分析与解决方案
为什么授权码流请求报错?
授权码流的/oauth2/token请求必须包含code和redirect_uri两个参数,你当前的请求缺少这两项,所以返回"Invalid request"错误。而且授权码流本质需要用户交互(通过/oauth2/authorize端点跳转登录页面获取授权码),完全不符合你无UI的M2M应用场景,这条路走不通。
无UI M2M场景获取刷新令牌的正确方案
对于无UI的机器对机器应用,若要获取刷新令牌,应该使用Resource Owner Password Credentials(ROPC)授权流,具体配置和请求步骤如下:
1. 调整用户池客户端配置
- 在Cognito用户池客户端设置中,开启Resource Owner Password Credentials授权类型
- 确保客户端的认证流程包含
ALLOW_USER_PASSWORD_AUTH(直接由应用发起请求)或ALLOW_ADMIN_USER_PASSWORD_AUTH(通过Admin API发起) - 你已设置的
ALLOW_REFRESH_TOKEN_AUTH保持不变,确保刷新令牌功能开启 - 确认
Allowed OAuth Scopes包含所需权限(比如openid)
2. 获取包含刷新令牌的Token请求
使用以下cURL调用/oauth2/token端点,直接传入用户凭证获取access_token、id_token和refresh_token:
curl \ -u "CLIENT_ID:CLIENT_SECRET" \ -d "grant_type=password" \ -d "username=你的用户名" \ -d "password=你的用户密码" \ -d "scope=openid" \ -X POST https://our-user-pool.auth.us-east-1.amazoncognito.com/oauth2/token
3. 使用刷新令牌获取新的Access Token
拿到refresh_token后,后续可以用它刷新令牌,无需再传入用户名密码:
curl \ -u "CLIENT_ID:CLIENT_SECRET" \ -d "grant_type=refresh_token" \ -d "refresh_token=你的刷新令牌" \ -X POST https://our-user-pool.auth.us-east-1.amazoncognito.com/oauth2/token
注意事项
- ROPC流需要直接处理用户密码,存在一定安全风险,生产环境中若非必要,优先考虑客户端凭证流配合短期Access Token。
- 确保用户池中的用户已启用密码认证,且凭证正确。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

