如何在Amplify JS中撤销AWS Cognito会话令牌(尤其是刷新令牌)
AWS Amplify JS 对接 Cognito 场景下的令牌撤销方案(含Refresh Token作废)
前置配置检查
- 先去Cognito用户池的对应应用客户端设置页,打开令牌撤销开关,否则所有服务端撤销接口调用都不会生效。
- 明确Cognito的令牌逻辑:Access Token、ID Token是无状态JWT,本身不支持远程实时作废,默认只能等自身有效期(通常1小时)到期自动失效;会话持久化的核心是Refresh Token,只要在服务端把Refresh Token作废,客户端就无法再续期拿到新的有效令牌,从根源上终止会话。
不同版本Amplify JS的实现代码
v6(当前主流稳定版)
全设备全局撤销(作废当前用户名下所有Refresh Token)
直接调用带global: true参数的登出方法即可,这个方法会主动请求Cognito的GlobalSignOut接口,把当前用户关联的所有Refresh Token标记为已撤销,同时自动清理浏览器/端侧本地存储的会话缓存。import { signOut } from 'aws-amplify/auth'; // 注意必须传global: true,否则只会清本地缓存,不会动服务端的Refresh Token await signOut({ global: true });踩坑提醒:如果不传这个参数,默认signOut只会删本地存的令牌,一旦Refresh Token之前被泄露,第三方依然可以拿它换发新的有效令牌,等于没做真正的撤销。
仅撤销当前会话的Refresh Token(不影响其他设备登录状态)
Amplify没有封装单独的单Refresh Token撤销方法,可以直接请求Cognito的OAuth2撤销端点实现,操作完手动清本地缓存即可:import { fetchAuthSession, signOut } from 'aws-amplify/auth'; // 先从当前会话取出Refresh Token const session = await fetchAuthSession(); const currentRefreshToken = session.tokens.refreshToken.toString(); // 调用撤销接口 await fetch(`https://<你的Cognito用户池服务端点>/oauth2/revoke`, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ token: currentRefreshToken, client_id: '<你的Cognito应用客户端ID>' }) }); // 接口调用成功后清理本地会话缓存 await signOut();
v5(旧版本)
v5的全局撤销逻辑和v6类似,只是API入口在Auth对象下:
import { Auth } from 'aws-amplify'; // 传global: true触发服务端全量Refresh Token撤销 await Auth.signOut({ global: true });
单Refresh Token撤销的逻辑和v6完全一致,直接调用/oauth2/revoke端点即可。
常见注意事项
- 已经签发的Access Token、ID Token无法通过撤销Refresh Token实时失效,在自身过期前依然可以通过校验。如果业务对安全等级要求极高,需要在后端服务层额外增加令牌黑名单逻辑做实时拦截。
- 开启令牌撤销功能后,Cognito签发的Access Token会新增
origin_jti字段,你可以基于这个字段做已撤销令牌的匹配校验。 - 如果你的应用接入了社交登录、SAML联邦身份,撤销Refresh Token的逻辑不会影响联邦身份提供方侧的会话状态,需要单独处理。
内容的提问来源于stack exchange,提问作者ambigus9
相关产品推荐
相关产品推荐

