如何通过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
相关产品推荐
相关产品推荐

