You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:05:32