【问题标题】:How to set JWT type in JWT Header如何在 JWT Header 中设置 JWT 类型
【发布时间】:2019-06-12 20:01:32
【问题描述】:

无法在令牌标头中设置 JWT 令牌类型。

这是为了制作我已经在 J​​AX-RS 中开发的安全 API。基本上我已经通过 Jwts.builder() 方法生成了一个令牌,作为回报,我在 APPLICATION_JSON 中获得了令牌,我将这个令牌粘贴到 https://jwt.io/ Debugger。所以我知道没有指定令牌类型的令牌头,只有{ “alg”:“HS512” } 也许这可能是我无法访问安全 API 的原因。当我尝试访问安全 API 时,我得到“不支持签名声明 JWS”异常。

AuthenticationService.java

private String issueToken(String login, String password) {

        LocalDateTime now = LocalDateTime.now().plusMinutes(10L);
        Instant instant = now.atZone(ZoneId.systemDefault()).toInstant();
        Date jwtExpiry = Date.from(instant);

        String jwtToken = Jwts.builder().setSubject(login).setIssuer("XYZ").setIssuedAt(new Date())
                .setExpiration(jwtExpiry).signWith(SignatureAlgorithm.HS512, "secretKey").compact();
        return jwtToken;
}

public class JWTTokenNeededFilter implements ContainerRequestFilter 
{
    public static final Logger logger = Logger.getLogger(JWTTokenNeededFilter.class);

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        String token = requestContext.getHeaderString("userToken");
        if (token == null) {
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
        }

        try {
            Jwts.parser().setSigningKey("secretKey").parseClaimsJwt(token);

            logger.info("Valid Token " + token);

        } catch (ExpiredJwtException expiredJwtException) {
            logger.info("Token Expires " + expiredJwtException);
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
        }

        catch (Exception exception) {
            logger.info("Exceptioin " + exception);
            requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
        }
    }
}

我期待这样的令牌标头

{ “alg”:“HS512”, “典型”:“智威汤逊” }

【问题讨论】:

    标签: json jersey jwt jax-rs


    【解决方案1】:

    您可以按照此处的说明使用标头进行设置:https://github.com/jwtk/jjwt/issues/174

    Header header = Jwts.header();
    header.setType("JWT");
    

    然后将header设置为builder(我没有编译代码)

    private String issueToken(String login, String password) {
    
        LocalDateTime now = LocalDateTime.now().plusMinutes(10L);
        Instant instant = now.atZone(ZoneId.systemDefault()).toInstant();
        Date jwtExpiry = Date.from(instant);
    
        Header header = Jwts.header();
        header.setType("JWT");
        //set additional headers
        String jwtToken = 
           Jwts.builder().setHeader((Map<String, Object>) 
            header).setSubject(login).setIssuer("XYZ").setIssuedAt(new 
            Date())
                .setExpiration(jwtExpiry).signWith(SignatureAlgorithm.HS512, 
              "secretKey").compact();
        return jwtToken;
    }
    

    【讨论】:

      【解决方案2】:

      您可以仅使用setHeaderParam("typ","JWT") jwt builder 方法设置标头。 https://github.com/jwtk/jjwt#header-parameters

       String token = Jwts.builder()
                          .setHeaderParam("typ","JWT")
                          .setSubject(user.getUserId().toString())
                          .claim("Roles",authResult.getAuthorities())
                          .setIssuedAt(new Date())
                          .setExpiration(new Date(System.currentTimeMillis()+EXPIRATION_TIME))
                          .signWith(Keys.hmacShaKeyFor(key))
                          .compact();
      

      【讨论】:

        猜你喜欢
        • 2017-06-05
        • 1970-01-01
        • 2016-05-19
        • 2021-09-03
        • 1970-01-01
        • 2020-02-01
        • 2018-02-08
        • 2019-09-23
        • 2022-10-21
        相关资源
        最近更新 更多