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

闲置60分钟后刷新Token的最佳实践(JavaScript+AWS Amplify/Cognito)

最优解决方案:让AWS SDK自动处理凭证刷新

你的问题根源在于手动维护Token并固定传入凭证提供者,导致Token过期后客户端无法自动获取新凭证。实际上AWS SDK与Amplify已内置自动刷新能力,无需每次调用API都重建客户端,核心是让凭证提供者动态获取最新有效Token。

具体修改方案

  1. 移除全局token变量,不再手动缓存和更新Token
  2. 修改凭证提供者的logins配置,将固定Token替换为动态获取当前Session的异步函数
  3. 仅初始化一次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:47:46