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

在JavaScript中利用Amazon Cognito刷新令牌获取新令牌的问题咨询

获取并使用Amazon Cognito的Refresh Token

我之前也踩过这个坑,其实获取Refresh Token以及用它刷新令牌的方法是有明确路径的,我来给你梳理清楚:

一、获取Refresh Token

默认情况下,Cognito不会自动返回refresh token,你需要在认证流程中做两个关键配置:

  • 开启授权码流程(设置responseType: 'code')
  • 把offline_access加入请求的权限范围(scopes)里

调整你的认证代码如下:

// 初始化用户池和用户对象
const authData = {
    UserPoolId: '你的用户池ID',
    ClientId: '你的客户端ID'
};
const userPool = new AmazonCognitoIdentity.CognitoUserPool(authData);
const userData = {
    Username: '你的用户名',
    Pool: userPool
};
const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

// 构建认证详情
const authDetails = new AmazonCognitoIdentity.AuthenticationDetails({
    Username: '你的用户名',
    Password: '你的密码'
});

// 发起认证请求,注意配置responseType和scope
cognitoUser.authenticateUser(authDetails, {
    responseType: 'code', // 必须开启授权码流程才能拿到refresh token
    scope: ['openid', 'email', 'offline_access'], // 必须包含offline_access
    onSuccess: function(result) {
        // 你原来获取access token和id token的代码
        const accessToken = result.getAccessToken().getJwtToken();
        const idToken = result.idToken.jwtToken;
        
        // 现在可以获取refresh token了
        const refreshToken = result.getRefreshToken().getToken();
        console.log('拿到Refresh Token:', refreshToken);
        // 建议把refresh token存在安全的存储中,比如secure cookie或者加密后的localStorage
    },
    onFailure: function(err) {
        console.error('认证失败:', err);
    }
});

二、用Refresh Token刷新新令牌

当access token过期后,你可以用保存的refresh token直接获取新的令牌,无需用户重新登录:

// 重新初始化用户池和用户对象
const userPool = new AmazonCognitoIdentity.CognitoUserPool({
    UserPoolId: '你的用户池ID',
    ClientId: '你的客户端ID'
});
const cognitoUser = new AmazonCognitoIdentity.CognitoUser({
    Username: '你的用户名',
    Pool: userPool
});

// 从存储中取出之前保存的refresh token,构建CognitoRefreshToken对象
const savedRefreshToken = '你之前保存的refresh token字符串';
const refreshTokenObj = new AmazonCognitoIdentity.CognitoRefreshToken({
    RefreshToken: savedRefreshToken
});

// 调用refreshSession方法刷新令牌
cognitoUser.refreshSession(refreshTokenObj, function(err, newSession) {
    if (err) {
        console.error('刷新令牌失败:', err);
        // 如果refresh token也过期/被吊销,这里需要引导用户重新登录
        return;
    }
    // 获取新的令牌
    const newAccessToken = newSession.getAccessToken().getJwtToken();
    const newIdToken = newSession.idToken.jwtToken;
    // 有些场景下会返回新的refresh token,记得更新存储
    const newRefreshToken = newSession.getRefreshToken().getToken();
    
    console.log('新的令牌已获取:', newAccessToken, newIdToken);
});

几个关键提醒

  • Refresh Token默认有效期是30天,你可以在用户池的应用客户端设置里调整时长
  • 一定要妥善保管refresh token,它相当于用户的长期登录凭证,泄露后风险很高
  • 如果refresh token过期或被吊销,refreshSession会返回错误,此时必须引导用户重新登录

内容的提问来源于stack exchange,提问作者Manoj Acharya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:07:32