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

如何持久化AWS Cognito用户会话?JavaScript SDK场景咨询

解决AWS Cognito会话页面刷新后丢失的问题

你的问题核心在于页面刷新后,Cognito的用户会话没有被正确恢复——getCurrentUser()能拿到用户实例,但会话令牌默认仅存在内存中,刷新后需要重新触发会话验证或从持久存储中恢复。下面是具体的解决方案:

关键修复步骤

  • 页面初始化自动恢复会话:在页面加载完成后立即调用会话获取逻辑,确保刷新后能重新验证并恢复会话。
  • 处理会话无效场景:当session.isValid()返回false时,要么引导用户重新登录,要么利用刷新令牌自动续期(Cognito SDK会自动尝试用refresh token刷新会话,需要正确处理回调)。
  • 全局变量挂载用户实例:把cognitoUser设为全局变量,避免函数作用域导致的访问失效问题。

修改后的完整代码

// 全局变量存储Cognito用户实例,确保跨函数/页面刷新后可访问
let cognitoUser;

function getSession() {
    const poolData = {
        UserPoolId: _config.cognito.userPoolId,
        ClientId: _config.cognito.clientId
    };

    const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    cognitoUser = userPool.getCurrentUser();

    // 先判断是否存在已登录用户
    if (!cognitoUser) {
        alert("请先登录");
        // 这里可以跳转到登录页,比如:window.location.href = "/login"
        return;
    }

    cognitoUser.getSession(function (err, session) {
        if (err) {
            console.error("获取会话失败:", err);
            alert("会话已过期,请重新登录");
            // 跳转到登录页
            return;
        }

        console.log('会话有效性: ' + session.isValid());

        // 会话有效时,获取并渲染用户属性
        if (session.isValid()) {
            cognitoUser.getUserAttributes(function (err, result) {
                if (err) {
                    console.error("获取用户属性失败:", err);
                    return;
                }
                console.log("用户属性:", result);
                // 更稳妥的属性获取方式(避免依赖数组索引)
                const emailAttr = result.find(attr => attr.Name === "email");
                if (emailAttr) {
                    // document.getElementById("email_value").innerHTML = emailAttr.getValue();
                }
            });
        } else {
            alert("会话无效,请重新登录");
            // 跳转到登录页
        }
    });
}

// 页面加载完成后自动触发会话恢复
document.addEventListener('DOMContentLoaded', function() {
    getSession();
});

额外优化建议

  • 令牌过期自动续期:Cognito的access token默认1小时过期,你可以设置定时器,在令牌过期前调用cognitoUser.refreshSession()主动刷新,避免用户操作时突然登出。
  • 细化错误处理:根据不同错误类型(如令牌过期、用户不存在)给出针对性提示,提升用户体验。
  • 依赖SDK自动存储:Cognito SDK默认会将会话令牌存在localStorage中,除非你手动修改了存储配置,否则无需额外手动存储令牌——只需确保页面加载时调用getSession即可。

内容的提问来源于stack exchange,提问作者Amit Pande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:10:32