java - JWT 组件信息

标签 java jwt token jhipster


    private static final Key secret = MacProvider.generateKey(SignatureAlgorithm.HS256);
    private static final byte[] secretBytes = secret.getEncoded();
    private static final String base64SecretBytes = Base64.getEncoder().encodeToString(secretBytes);

    private static String generateToken(String subject, String issuer, String audience) {
        String id = UUID.randomUUID().toString().replace("-", "");
        Date now = new Date();
        Date exp = new Date(System.currentTimeMillis() + (1000 * 30)); // 30 seconds

        String token = Jwts.builder()
                .setId(id)
                .setIssuedAt(now)
                .setNotBefore(now)
                .setExpiration(exp)
                .setSubject(subject)
                .setIssuer(issuer)
                .setAudience(audience)
                .signWith(SignatureAlgorithm.HS256, base64SecretBytes)
                .compact();

        return token;
    }

    private static void verifyToken(String token) {
        Claims claims = Jwts.parser()
                .setSigningKey(base64SecretBytes)
                .parseClaimsJws(token).getBody();

        System.out.println("----------------------------");
        System.out.println("ID: " + claims.getId());
        System.out.println("Subject: " + claims.getSubject());
        System.out.println("Issuer: " + claims.getIssuer());
        System.out.println("Expiration : " + claims.getExpiration());
        System.out.println("Not Before : "+claims.getNotBefore());
        System.out.println("Audience :: "+claims.getAudience());
    }

我有网络服务 JHipster API,我编写了 Java 代码来连接它,并且我知道 JWT token 具有来自 JWT 网站 https://jwt.io/ 的三个组件

首先解码

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

第二个是有效负载

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

我在这部分的问题是我们如何知道 JHipster API 网络服务中的 sub、name 和 iat?

最佳答案

[更新]

这个答案是根据 io.jsonwebtoken:jjwt 库

根据其 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 的 key 。使用此 key ,您可以验证您的 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 validator 来执行此操作:

JWTVerifier verifier = JWT.require("YOUR ALGORITHM").build();
DecodedJWT decodedJWT = verifier.verify(JWTString)

关于java - JWT 组件信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51853951/

相关文章:

java - 如何使用 Hibernate OGM 和 MongoDB 删除数据库或集合

javascript - 通过express处理jwt token 返回错误 "const token = req.cookies.auth; [0] ^ [0] [0] ReferenceError: req is not defined"

jwt - 使用 AWS API Gateway 时是否可以从自定义 Lambda 授权方传回 JWT 负载?

laravel - 解决 Laravel 中 token 不匹配错误的正确方法是什么?

windows-services - 如何获取 CreateProcessAsUser 的有效用户 token ?

java - 不使用基于java的tasklet执行存储过程

java - 如何在 Java 的 MigLayout 中强制组件增长

java - 从 linux Deepin 15 中的 java 应用程序打印在 jaspersoft studio 中制作的报告时出错

node.js - 如何识别授予授权权限的用户?

Javascript - 控制台成功打印我的数据时出现未捕获的 ReferenceError : azZkVUpgbG is not defined,