如何在 JWT Header 中设置 JWT 类型
Posted
技术标签:
【中文标题】如何在 JWT Header 中设置 JWT 类型【英文标题】:How to set JWT type in JWT Header 【发布时间】:2019-06-12 20:01:32 【问题描述】:无法在令牌标头中设置 JWT 令牌类型。
这是为了制作我已经在 JAX-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”, “典型”:“智威汤逊”
【问题讨论】:
【参考方案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();
【讨论】:
以上是关于如何在 JWT Header 中设置 JWT 类型的主要内容,如果未能解决你的问题,请参考以下文章
express-jwt 和带有 cookie 的 Angular 9:未在“授权”标头中设置令牌
如何在 asp.net core 中设置 jwt 令牌的生命周期