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)不符合此规范,但符合.

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

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

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

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

Spring Cloud Feign如何实现JWT令牌中继,传递认证信息?

- - 程序猿DD
在上一篇实现了 Spring Cloud资源服务器的定制化,但是又发现了一个新的问题,Spring Cloud微服务调用的过程中需要令牌中继. 只有令牌中继才能在调用链中保证用户认证信息的传递. 今天就来分享一下如何在Feign中实现令牌中继. 令牌中继(Token Relay)是比较正式的说法,说白了就是让Token令牌在服务间传递下去以保证资源服务器能够正确地对调用方进行鉴权.

基于token的多平台身份认证架构设计 - 一点一滴的Beer - 博客园

- -
在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了  一个服务器,N个客户端的格局 . 不同的客户端产生了不同的用户使用场景,这些场景:. 综上所述,它们的身份认证方式也存在一定的区别. 本文将使用一定的篇幅对这些场景进行一些分析和梳理工作.

服务器session和jwt之争

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

RSA的SecureID token数据被偷了?

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