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 组件信息的主要内容,如果未能解决你的问题,请参考以下文章

drf认证组件权限组件jwt认证签发jwt框架使用

DRF框架——drf-jwt手动签发与校验过滤组件筛选组件排序组件分页组件

drf-jwt手动签发与校验与drf小组件

基于 AOP 和 JWT 实现的 Token 身份认证组件

基于 AOP 和 JWT 实现的 Token 身份认证组件

基于 AOP 和 JWT 实现的 Token 身份认证组件