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

如何通过Amplify/Cognito API查询用户在特定设备的登录时长?

结论

Cognito 及 Amplify 均未提供原生 API 支持查询特定设备上的用户登录时长,你最初的实现思路无法直接落地。针对你需要给同一用户池内不同用户配置差异化refresh token有效期的需求,有三种成熟的实现方案:

可选实现方案

  • 方案一:Cognito触发器自定义refresh token有效期(最推荐)
    先将两类用户划入不同的Cognito用户组,为用户池配置「预令牌生成(Pre Token Generation)」Lambda触发器。触发器内判断用户所属用户组,返回自定义的refreshTokenExpiration参数,即可为不同组用户设置完全不同的refresh token有效期,Cognito会自动处理过期逻辑,无需你手动校验登录时长。
    注意需要先在Cognito用户池的令牌配置页开启「允许自定义refresh token过期时间」开关,该自定义参数才会生效。
  • 方案二:自定义存储登录记录做校验
    如果需要更灵活的登出控制,可以在用户每次登录成功时,将用户ID+设备ID+登录时间戳存储在你的自有数据库(如DynamoDB)中。每次用户使用refresh token申请新会话凭证时,先查询对应记录计算已登录时长,超过阈值就调用AdminUserGlobalSignOut接口吊销该用户所有有效refresh token,同时删除对应存储记录即可。
    设备标识可以通过Amplify的Auth.currentUserInfo()接口获取,也可以自行生成设备指纹存在客户端本地存储中。
  • 方案三:利用ID令牌内置声明做轻量校验
    Cognito签发的ID令牌默认携带auth_time声明,值为用户本次认证成功的Unix时间戳,你可以在前端每次发起请求前计算当前时间和auth_time的差值,超过阈值就主动调用Auth.signOut()方法登出用户。该方案无需后端改造,但前端校验可被绕过,仅适合安全要求不高的场景。

技术栈适配示例

你使用的Amplify框架可以直接调用接口获取auth_time计算登录时长,示例代码如下:

import { Auth } from 'aws-amplify';

// 返回当前用户已登录时长,单位:秒
const getCurrentLoginDuration = async () => {
  const currentSession = await Auth.currentSession();
  const authTimestamp = currentSession.getIdToken().payload.auth_time;
  return Math.floor(Date.now() / 1000) - authTimestamp;
};

如果需要后端校验,AppSync的Resolver中可以直接解析请求头内携带的ID令牌,提取auth_time字段做时长判断,符合过期条件直接返回401状态码即可触发前端重新登录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:54:03