闲置60分钟后刷新Token的最佳实践(JavaScript+AWS Amplify/Cognito)
最优解决方案:让AWS SDK自动处理凭证刷新
你的问题根源在于手动维护Token并固定传入凭证提供者,导致Token过期后客户端无法自动获取新凭证。实际上AWS SDK与Amplify已内置自动刷新能力,无需每次调用API都重建客户端,核心是让凭证提供者动态获取最新有效Token。
具体修改方案
- 移除全局
token变量,不再手动缓存和更新Token - 修改凭证提供者的
logins配置,将固定Token替换为动态获取当前Session的异步函数 - 仅初始化一次DynamoDB客户端,后续复用该客户端即可
修改后的完整代码:
import { Amplify, Auth } from 'aws-amplify'; import { fromCognitoIdentityPool } from "@aws-sdk/credential-providers"; import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { DynamoDBDocumentClient, QueryCommand } from "@aws-sdk/lib-dynamodb"; let ddbDocClient; Amplify.configure({ Auth: { region: REGION, userPoolId: USERPOOLID, userPoolWebClientId: USERPOOLWEBCLIENTID, }, }); // 初始化AWS客户端,仅执行一次 (async () => { try { await initializeAWS(); } catch (e) { console.warn("You need to log in first!"); } })(); async function initializeAWS() { try { const config = { region: REGION, credentials: fromCognitoIdentityPool({ identityPoolId: IDENTITYPOOLID, clientConfig: { region: REGION }, // 关键修改:用异步函数动态获取最新登录凭证 logins: async () => { const session = await Auth.currentSession(); return { [`cognito-idp.${REGION}.amazonaws.com/${USERPOOLID}`]: session.getIdToken().getJwtToken() }; } }), }; const ddbClient = new DynamoDBClient(config); ddbDocClient = DynamoDBDocumentClient.from(ddbClient); } catch (e) { console.warn(e); } } async function queryTable(PK){ const params = { TableName: "HES", KeyConditionExpression: "#PK = :PK", ExpressionAttributeNames: { "#PK": "PK" }, ExpressionAttributeValues: { ":PK": PK }, }; try { const data = await ddbDocClient.send(new QueryCommand(params)); console.log("Result Query\n", data.Items); } catch (e) { // 处理Session完全失效的情况(如Refresh Token过期) if (e.name === 'NotAuthorizedException') { console.warn("Session expired, please log in again."); // 这里可添加跳转登录页的逻辑 } else { console.warn(e); } } } $("#queryTestButton").on("click", () => { queryTable("test"); });
原理说明
fromCognitoIdentityPool的logins参数支持传入异步函数,当AWS SDK需要获取或刷新凭证时,会自动调用该函数Auth.currentSession()内部会自动处理AccessToken刷新:若当前AccessToken过期但Refresh Token有效,会自动向Cognito请求新的AccessToken,无需手动调用refreshSession- 客户端仅需初始化一次,后续所有API调用都会复用该客户端,并在需要时自动刷新凭证,完全无需手动干预
额外提示
- 若用户闲置超过30天(Refresh Token过期),
Auth.currentSession()会抛出错误,此时需引导用户重新登录 - 可在全局错误处理中统一处理Session失效场景,避免每个API调用重复编写错误逻辑
内容的提问来源于stack exchange,提问作者redfuse
相关产品推荐
相关产品推荐

