JWT认证,取得过期token的用户名

标签: jwt 认证 token | 发表时间:2020-03-05 09:55 | 作者:撸撸呀
出处:https://juejin.im/welcome/backend

前言

项目前后端分离,请求认证使用的是JWT无状态认证。最近遇到一个问题,认证token需要从token中获取用户名,但是这个token有可能是过期的。一般取得用户名用的是下面的代码。

  private Claims getClaimsFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody();
}
复制代码

如果token没有过期,则可以通过Claims.getSubject()获得用户名。但是token过期,则会抛出ExpiredJwtException异常,导致无法获取用户名。

解决方法

查看ExpiredJwtException异常,会发现它的父类ClaimJwtException封装了Claims类成员。所以只要调用getClaims()方法就可以取得Claim对象,进而取得用户名。

  public abstract class ClaimJwtException extends JwtException {
    public static final String INCORRECT_EXPECTED_CLAIM_MESSAGE_TEMPLATE = "Expected %s claim to be: %s, but was: %s.";
    public static final String MISSING_EXPECTED_CLAIM_MESSAGE_TEMPLATE = "Expected %s claim to be: %s, but was not present in the JWT claims.";
    private final Header header;
    private final Claims claims;

    protected ClaimJwtException(Header header, Claims claims, String message) {
        super(message);
        this.header = header;
        this.claims = claims;
    }

    protected ClaimJwtException(Header header, Claims claims, String message, Throwable cause) {
        super(message, cause);
        this.header = header;
        this.claims = claims;
    }

    public Claims getClaims() {
        return this.claims;
    }

    public Header getHeader() {
        return this.header;
    }
}
复制代码

取得用户名的代码如下。

  
/**
 * 从token中获取用户名
 */
public String getUsernameFromToken(String token) {
    try {
        return getClaimsFromToken(token).getSubject();
    } catch (ExpiredJwtException e) {
        // 过期则从ExpiredJwtException中取username
        return e.getClaims().getSubject();
    }
}
复制代码

相关 [jwt 认证 token] 推荐:

JWT认证,取得过期token的用户名

- - 掘金后端
项目前后端分离,请求认证使用的是JWT无状态认证. 最近遇到一个问题,认证token需要从token中获取用户名,但是这个token有可能是过期的. 一般取得用户名用的是下面的代码. .getBody(); } 复制代码. 如果token没有过期,则可以通过Claims.getSubject()获得用户名.

什么是 JWT -- JSON WEB TOKEN - 简书

- -
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(. (RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景. JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密.

关于JWT Token 自动续期的解决方案

- -
在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个jwt token. 前端(如vue)在接收到jwt token后会将token存储到LocalStorage中. 后续每次请求都会将此token放在请求头中传递到后端服务,后端服务会有一个过滤器对token进行拦截校验,校验token是否过期,如果token过期则会让前端跳转到登录页面重新登录.

Refresh Token的使用场景以及如何与JWT交互 - 我是钟钟的个人空间 - OSCHINA

- -
OAuth2定义的Refresh Token的概念. 我们将会明白为什么他们会这样做,以及他们如何与其他类型的Token进行比较. 我们也将通过一个简单的例子来学习如何使用它们. 更新:目前这篇文章写的Auth0还没有通过. OpenID Connect认证. access token)不符合此规范,但符合.

SpringBoot 整合 oauth2(三)实现 token 认证 - 简书

- -
关于session和token的使用,网上争议一直很大. session是空间换时间,而token是时间换空间. session占用空间,但是可以管理过期时间,token管理部了过期时间,但是不占用空间.. sessionId失效问题和token内包含. session基于cookie,app请求并没有cookie.

SpringSecutity+JWT认证流程解析 | segmentfault新人第一弹

- - SegmentFault 最新的文章
纸上得来终觉浅,觉知此事要躬行. 本文适合: 对Spring Security有一点了解或者跑过简单demo但是对整体运行流程不明白的同学,对SpringSecurity有兴趣的也可以当作你们的入门教程,示例代码中也有很多注释. 本文代码: 码云地址  GitHub地址. 大家在做系统的时候,一般做的第一个模块就是 认证与授权模块,因为这是一个系统的入口,也是一个系统最重要最基础的一环,在认证与授权服务设计搭建好了之后,剩下的模块才得以安全访问.

RSA的SecureID token数据被偷了?

- ripwu - 张志强的网络日志
博客 » 记事本 » 密码学 ». WSJ报道:RSA承认其数据被偷,4000万SecureID token需要被更新. 中国银行银行密钥用的就是RSA生产,就是下图这玩意儿,手里有这玩意儿的同学们要小心了(当然,如果你的账户里的钱没有6位数以上,也不用太担心,毕竟网银的安全性不全依赖于这个设备):.

服务器session和jwt之争

- - zzm
session 和cookie的目的相同,都是为了克服http协议无状态的缺陷,但完成的方法不同. session通过cookie,在客户端保存session id,而将用户的其他会话消息保存在服务端的session对象中,与此相对的,cookie需要将所有信息都保存在客户端. 因此cookie存在着一定 的安全隐患,例如本地cookie中保存的用户名密码被破译,或cookie被其他网站收集(例如:1.

微信平台的token安全验证(转)

- - 行业应用 - ITeye博客
本文目标:学习一种比较安全的服务器间互相验证身份的方式. 问题:开发微信公众平台接口,开发者的服务器为了确保请求是否来自微信服务器,应该如何去做. 1)  在微信管理页面上填写URL和TOKEN,开发者服务器上也记录同样的TOKEN. 2)  微信服务器发送HTTP请求,附带上参数(注意TOKEN是不会被传输的).

springmvc下的基于token的防重复提交

- - zzm
现在的网站在注册步骤中,由于后台要处理大量信息,造成响应变慢(测试机器性能差也是造成变慢的一个因素),在前端页面提交信息之前,等待后端响应,此时如果用户. 再点一次提交按钮,后台会保存多份用户信息. 为解决此问题,借鉴了struts2的token思路,在springmvc下实现token. 在springmvc配置文件中加入拦截器的配置,拦截两类请求,一类是到页面的,一类是提交表单的.