json - 如何在JWT Header中设置JWT类型

无法在 token header 中设置 JWT token 类型。

这是为了制作我已经在 J​​AX-RS 中开发的安全 API。基本上我已经通过 Jwts.builder() 方法生成了一个 token ,作为返回,我在 APPLICATION_JSON 中获得了 token ,我将这个 token 粘贴到 https://jwt.io/ 调试器。所以我知道没有 token 类型指定 token 头,只有 { “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());
        }
    }
}

我期待这样的 token header

{ "alg": "HS512", "typ": "JWT" }

最佳答案

您可以仅使用 setHeaderParam("typ","JWT") jwt 构建器方法设置 header 。 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();

https://stackoverflow.com/questions/54255938/

相关文章:

python - 使用多行字符串时的缩进

python - 如何从兄弟目录导入python模块?

python - Pandas 中 "&"和 "and"之间的区别

ruby-on-rails - 如何使用 gsub 删除 .在 ruby 字符串的末尾?

python - 保持 Python 脚本运行的简单方法?

apache-kafka - 用于重复数据删除的 Kafka 压缩

haskell - 如何获取具有 Bounded 实例的类型的 maxBound

sql - 选择具有多个 DATETIME 值的最大日期

sql-server - 在 T-SQL 中划分日期值

amazon-s3 - 将名称包含尾部斜杠的文件上传到 AWS S3 存储桶