gpt4 book ai didi

java - 我在使用 JJWT 库创建 JWT 时遇到问题

转载 作者:行者123 更新时间:2023-12-02 09:12:28 25 4
gpt4 key购买 nike

我在使用 JJWT 库创建 JWT 时遇到问题:https://github.com/jwtk/jjwt

我按照说明进行操作并想出了这个简单的类:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Calendar;
import java.util.Date;

public class Test {
public static void main(String[] args){

Date date = new Date();
Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.HOUR, 1);

Date expirationDate = cal.getTime();

String jws = Jwts.builder()
.setSubject("user")
.setId("1")
.setIssuer("me")
.setIssuedAt(new Date())
.setExpiration(expirationDate)
.setIssuedAt(date)
.signWith(key)
.compact();

System.out.println("jws: "+ jws);
decode(jws);
}


public static Jws<Claims> decode(String token){
return Jwts.parser().setSigningKey(Keys.secretKeyFor(SignatureAlgorithm.HS256)).parseClaimsJws(token);
}
}

当我运行它时,我得到输出:

jws: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwianRpIjoiMSIsImlzcyI6InZpY3RvciIsImlhdCI6MTU3NjEwMTAyNiwiZXhwIjoxNTc2MTA0NjI2fQ.28JIsQSc273GT_qjyXEGjyh5KTJJ3thYVGQAa4ZQzvo

和异常(exception):

Exception in thread "main" io.jsonwebtoken.security.SignatureException: JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.
at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:383)
at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:513)
at io.jsonwebtoken.impl.DefaultJwtParser.parseClaimsJws(DefaultJwtParser.java:573)
at Test.decode(Test.java:38)
at Test.main(Test.java:33)

此外,当我将 jwt 粘贴到此网站上时:https://jwt.io/它给了我正确的(我认为)标题:

{
"alg": "HS256"
}

以及正确的有效负载:

{
"sub": "user",
"jti": "1",
"iss": "victor",
"iat": 1576100934,
"exp": 1576104534
}

但它说签名无效。

我做错了什么?如何正确创建签名?

最佳答案

验证是指根据创建 token 时使用的相同 key (在对称算法的情况下,例如 HS256)检查签名。

在您的代码中,您使用 convenience function :

Keys.secretKeyFor(SignatureAlgorithm.HS256))

它正在为给定的算法创建合适的 key 。但是,您不会将 key 保存在 token 创建方法中的任何位置,并在检查 token 时生成一个新 key 。那一定会失败。

相反,您必须保存生成的 key 并在验证调用中使用它。

此外,当您在jwt.io上检查您的 token 时,您需要在右栏“验证签名”下的输入字段中提供用于创建的 key 。如果不知道 key ,则无法验证签名。

在任何实际使用场景中,您不会为每个 token 创建一个新 key ,而是使用一个可能存储在服务器端的 key 。

关于java - 我在使用 JJWT 库创建 JWT 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59296293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com