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

如何配置Cognito刷新令牌过期时间?应用令牌永不过期问题咨询

认证会话刷新问题:解决RefreshToken永不过期的问题

看起来你在处理客户端路由的身份验证逻辑时遇到了棘手的问题——refreshToken始终不会过期,只能靠手动清空localStorage来让令牌失效,这显然不是正常的认证流程该有的样子。我来帮你拆解问题,一步步解决:

核心结论:RefreshToken并非默认永不过期

你遇到的情况,本质上是授权服务端没有配置或生效refreshToken的过期策略,再加上客户端可能没有正确校验refreshToken的有效性导致的。正常情况下,refreshToken是有过期时间的,而且通常会比accessToken长(比如1小时、7天不等),用来在accessToken过期后获取新的令牌,避免用户频繁登录。

为什么你的RefreshToken一直能刷新?

你提到每次调用refreshToken都能拿到新令牌,哪怕cachedSession.isValid()返回false,大概率是这几个原因:

  • 服务端生成refreshToken时,根本没设置过期时间(比如存储refreshToken的数据库记录没有过期字段,或者JWT里没加exp声明);
  • 服务端校验refreshToken时,只验证了签名是否合法,完全忽略了过期检查;
  • 你的客户端isValid()方法只校验了accessToken的有效性,没有检查refreshToken是否过期,导致明明refreshToken已经失效,还是去调用刷新接口,而服务端又没拒绝。

如何配置RefreshToken 1小时过期?

这一步主要需要在授权服务端操作,不同的认证框架配置方式不同,但核心逻辑一致:

  1. 生成refreshToken时设置过期时间:比如在OAuth2/OpenID Connect的服务端配置里,找到"Refresh Token Lifespan"之类的选项,设置为3600秒(1小时);如果是自定义服务,生成JWT格式的refreshToken时,一定要加入exp声明(过期时间戳)。
  2. 服务端存储与校验:如果refreshToken是存在数据库里的,要同步记录过期时间;当客户端用refreshToken请求新令牌时,服务端先检查该令牌是否过期,过期则返回invalid_grant错误。
  3. 客户端配合校验:客户端要能读取refreshToken的过期时间(比如解码JWT的exp字段),在调用刷新接口前先判断是否过期,避免无效请求。

举个自定义服务生成带过期时间的refreshToken的伪代码(Node.js为例):

const jwt = require('jsonwebtoken');

// 生成refreshToken,设置1小时过期
const generateRefreshToken = (userId) => {
  return jwt.sign(
    { userId },
    process.env.REFRESH_TOKEN_SECRET,
    { expiresIn: '1h' } // 这里设置过期时间
  );
};

// 校验refreshToken时,自动校验过期
const verifyRefreshToken = (token) => {
  try {
    return jwt.verify(token, process.env.REFRESH_TOKEN_SECRET);
  } catch (error) {
    // 过期或无效会抛出错误
    return null;
  }
};

客户端代码的优化建议

你的当前代码只依赖currentSession.isValid()来判断状态,但这个方法可能只检查了accessToken。你需要补充refreshToken的校验逻辑:

const currentSession = await authorisationProvider.getSession();
let isAuthenticated = false;

if (currentSession) {
  // 1. 先检查refreshToken是否过期(假设session里存了过期时间)
  const isRefreshTokenValid = Date.now() < currentSession.refreshTokenExpiresAt;

  if (currentSession.isValid()) {
    // accessToken有效,直接标记已认证
    isAuthenticated = true;
  } else if (isRefreshTokenValid) {
    // accessToken过期,但refreshToken有效,尝试刷新
    try {
      const newSession = await authorisationProvider.refreshToken();
      // 保存新会话到本地
      authorisationProvider.saveSession(newSession);
      isAuthenticated = true;
    } catch (err) {
      // 刷新失败,说明refreshToken已失效或被撤销
      isAuthenticated = false;
      // 清空本地会话,跳转登录页
      localStorage.removeItem('authSession');
      window.location.href = '/login';
    }
  } else {
    // refreshToken也过期了,直接跳转登录
    isAuthenticated = false;
    localStorage.removeItem('authSession');
    window.location.href = '/login';
  }
}

this.setState({ isAuthenticated, busy: false });

这样调整后,当refreshToken过期时,客户端会直接引导用户重新登录,而不是一直尝试刷新令牌。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:47:19