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

前言

项目先后端分离,请求认证使用的是JWT无状态认证。最近遇到一个问题,认证token须要从token中获取用户名,可是这个token有多是过时的。通常取得用户名用的是下面的代码。java

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;
    }
}
复制代码

取得用户名的代码以下。this

/** * 从token中获取用户名 */
public String getUsernameFromToken(String token) {
    try {
        return getClaimsFromToken(token).getSubject();
    } catch (ExpiredJwtException e) {
        // 过时则从ExpiredJwtException中取username
        return e.getClaims().getSubject();
    }
}
复制代码
相关文章
相关标签/搜索