在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
相关产品推荐
相关产品推荐

