如何用amazon-cognito-identity-js通过已有令牌初始化并认证CognitoUser
解决方案:手动初始化CognitoUser并完成REFRESH_TOKEN认证
核心结论
可以通过现有令牌和用户名/Sub手动初始化CognitoUser对象,也可以直接调用initiateAuth完成刷新认证,无需依赖SDK自动生成的本地存储键。
方法一:手动构建CognitoUser并关联会话
步骤1:创建UserPool实例
首先初始化用户池对象,传入你的用户池ID和客户端ID:
const userPool = new AmazonCognitoIdentity.CognitoUserPool({ UserPoolId: 'YOUR_USER_POOL_ID', ClientId: 'YOUR_CLIENT_ID' });
步骤2:创建CognitoUser对象
直接传入用户名(或Sub值)和用户池实例即可,不需要依赖本地存储的LastAuthUser键:
const cognitoUser = new AmazonCognitoIdentity.CognitoUser({ Username: 'USER_USERNAME_OR_SUB', Pool: userPool });
步骤3:构建CognitoUserSession
将本地存储的令牌字符串转换为SDK对应的令牌类实例,再组装成会话对象:
// 从localStorage获取令牌 const storedIdToken = localStorage.getItem('idToken'); const storedAccessToken = localStorage.getItem('accessToken'); const storedRefreshToken = localStorage.getItem('refreshToken'); // 转换为SDK令牌实例 const idToken = new AmazonCognitoIdentity.CognitoIdToken({ IdToken: storedIdToken }); const accessToken = new AmazonCognitoIdentity.CognitoAccessToken({ AccessToken: storedAccessToken }); const refreshToken = new AmazonCognitoIdentity.CognitoRefreshToken({ RefreshToken: storedRefreshToken }); // 组装用户会话 const userSession = new AmazonCognitoIdentity.CognitoUserSession({ IdToken: idToken, AccessToken: accessToken, RefreshToken: refreshToken });
步骤4:关联会话并调用刷新
将构建好的会话绑定到CognitoUser对象,之后即可正常调用refreshSession:
// 绑定会话到用户对象 cognitoUser.setSignInUserSession(userSession); // 执行刷新操作 cognitoUser.refreshSession(refreshToken, (err, newSession) => { if (err) { console.error('刷新令牌失败:', err); return; } // 更新localStorage中的新令牌 localStorage.setItem('idToken', newSession.getIdToken().getJwtToken()); localStorage.setItem('accessToken', newSession.getAccessToken().getJwtToken()); if (newSession.getRefreshToken()) { localStorage.setItem('refreshToken', newSession.getRefreshToken().getToken()); } });
方法二:直接调用initiateAuth(更简洁)
既然本质是调用initiateAuth方法,也可以跳过CognitoUser对象的构建,直接调用AWS SDK的CognitoIdentityServiceProvider接口完成刷新:
const cognitoISP = new AWS.CognitoIdentityServiceProvider({ region: 'YOUR_REGION' }); cognitoISP.initiateAuth({ AuthFlow: 'REFRESH_TOKEN_AUTH', ClientId: 'YOUR_CLIENT_ID', AuthParameters: { REFRESH_TOKEN: localStorage.getItem('refreshToken'), USERNAME: 'USER_USERNAME_OR_SUB' // 部分用户池配置需要此参数,可尝试省略后测试 } }, (err, data) => { if (err) { console.error('刷新认证失败:', err); return; } // 提取并存储新令牌 const { IdToken, AccessToken, RefreshToken } = data.AuthenticationResult; localStorage.setItem('idToken', IdToken); localStorage.setItem('accessToken', AccessToken); if (RefreshToken) { localStorage.setItem('refreshToken', RefreshToken); } });
注意事项
- 用户名/Sub的使用:Cognito允许用用户的
sub(用户唯一标识)替代username作为用户标识,直接传入即可。 - 设备跟踪:如果你的用户池开启了设备跟踪,可能需要额外传入
DEVICE_KEY参数,但绝大多数REFRESH_TOKEN_AUTH场景不需要。 - 权限配置:确保你的客户端ID允许使用
REFRESH_TOKEN_AUTH认证流,可在Cognito控制台的应用客户端设置中确认。
内容的提问来源于stack exchange,提问作者Igor.K
相关产品推荐
相关产品推荐

