首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JWT头中设置JWT类型

如何在JWT头中设置JWT类型
EN

Stack Overflow用户
提问于 2019-01-18 14:24:33
回答 3查看 6.8K关注 0票数 2

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

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

AuthenticationService.java

代码语言:javascript
复制
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","typ":"JWT“}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-06 19:21:45

您可以使用标题进行设置,如下所述:https://github.com/jwtk/jjwt/issues/174

代码语言:javascript
复制
Header header = Jwts.header();
header.setType("JWT");

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

代码语言:javascript
复制
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;
}
票数 4
EN

Stack Overflow用户

发布于 2020-10-01 20:13:56

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

代码语言:javascript
复制
 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();
票数 5
EN

Stack Overflow用户

发布于 2022-03-30 21:37:38

您可以在标头接口中使用Header.JWT_TYPE静态字段。这是更清洁和避免样板代码:例如:

代码语言:javascript
复制
 private static String generateToken() {
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .setHeaderParam("typ", Header.JWT_TYPE)
                .compact();
    }
and output which you want:
{
  "typ": "JWT",
  "alg": "HS256"
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54255938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档