JWT 组件信息
Posted
技术标签:
【中文标题】JWT 组件信息【英文标题】:JWT components information 【发布时间】:2019-01-22 01:12:38 【问题描述】: 私有静态最终密钥秘密 = MacProvider.generateKey(SignatureAlgorithm.HS256); 私有静态最终字节[] secretBytes = secret.getEncoded(); 私有静态最终字符串 base64SecretBytes = Base64.getEncoder().encodeToString(secretBytes); private static String generateToken(String subject, String issuer, String Audience) 字符串 id = UUID.randomUUID().toString().replace("-", ""); 现在日期 = 新日期(); 日期 exp = new Date(System.currentTimeMillis() + (1000 * 30)); // 30秒 字符串令牌 = Jwts.builder() .setId(id) .setIssuedAt(现在) .setNotBefore(现在) .setExpiration(exp) .setSubject(主题) .setIssuer(发行人) .setAudience(观众) .signWith(SignatureAlgorithm.HS256, base64SecretBytes) 。袖珍的(); 返回令牌; 私人静态无效验证令牌(字符串令牌) 声明声明 = Jwts.parser() .setSigningKey(base64SecretBytes) .parseClaimsJws(token).getBody(); System.out.println("----------------------------"); System.out.println("ID:" + claim.getId()); System.out.println("主题:" + claim.getSubject()); System.out.println("发行者:" + claim.getIssuer()); System.out.println("过期时间:" + claim.getExpiration()); System.out.println("不在之前:"+claims.getNotBefore()); System.out.println("Audience :: "+claims.getAudience());我有网络服务 JHipster API,我编写了 Java 代码来连接它,我知道 JWT 令牌具有来自 JWT 网站 https://jwt.io/ 的三个组件 第一次解码
“alg”:“HS256”, “典型”:“智威汤逊”秒是有效负载
“子”:“1234567890”, “名称”:“约翰·多伊”, “iat”:1516239022我在这部分的问题是我们如何知道 JHipster API webserves 中的 sub、name 和 iat ?
【问题讨论】:
【参考方案1】:[更新]
这个答案是根据 io.jsonwebtoken:jjwt library
根据他们的github 页面上提供的文档
Jws<Claims> jws;
try
jws = Jwts.parser() // (1)
.setSigningKey(key) // (2)
.parseClaimsJws(jwsString); // (3)
// we can safely trust the JWT
catch (JwtException ex) // (4)
// we *cannot* use the JWT as intended by its creator
setSigningKey()
是您用来保护您的 JWT 的密钥。使用此密钥,您可以验证您的 JWT 是否未更改且有效。
parseClaimsJws() 是您将 JWSString 设置为参数的地方。
之后,您应该能够遍历声明并读取值
[旧]
这个答案是根据 com.auth0:java-jwt 库
为了让你“声称”你必须解码你的 JWT。您可以使用以下代码执行此操作:
DecodedJWT decodedJWT = JWT.decode(JWTString);
String sub = decodedJWT.getClaim("sub").asString();
String name = decodedJWT.getClaim("name").asString();
String iat = decodedJWT.getClaim("iat").asInt();
如果您还想验证 JWT 是否仍然有效,您可以使用 JWT 验证器来执行此操作:
JWTVerifier verifier = JWT.require("YOUR ALGORITHM").build();
DecodedJWT decodedJWT = verifier.verify(JWTString)
【讨论】:
我遇到了这个问题 - JWTString 无法解析为变量 - DecodedJWT 无法解析为 JWTString 应该是您要解码的编码 JWT 字符串。因此,在您的情况下,该变量的名称是“令牌”。使用“token”的值而不是 JWTString [error ][1] [1]: i.stack.imgur.com/i8hnZ.png 我得到这个错误 你能给我一张图片,我还可以看到你的导入以及你使用哪个 JWT 库? 在我的主要内容中,我写了 String token = generateToken("Admin", "Issuer", "Audience"); System.out.println("TOKEN :: "+token);验证令牌(令牌);但我不知道 generateToken 函数中的正确参数以上是关于JWT 组件信息的主要内容,如果未能解决你的问题,请参考以下文章