首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我很难用JJWT库创建JWT

我很难用JJWT库创建JWT
EN

Stack Overflow用户
提问于 2019-12-12 01:03:54
回答 1查看 2K关注 0票数 0

我很难用JJWT库创建JWT:https://github.com/jwtk/jjwt

我遵循了这些指令,并提出了一个简单的课程:

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
jws: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwianRpIjoiMSIsImlzcyI6InZpY3RvciIsImlhdCI6MTU3NjEwMTAyNiwiZXhwIjoxNTc2MTA0NjI2fQ.28JIsQSc273GT_qjyXEGjyh5KTJJ3thYVGQAa4ZQzvo

例外是:

代码语言:javascript
复制
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/上时,它会给出正确的(我猜)标题:

代码语言:javascript
复制
{
  "alg": "HS256"
}

正确的有效载荷:

代码语言:javascript
复制
{
  "sub": "user",
  "jti": "1",
  "iss": "victor",
  "iat": 1576100934,
  "exp": 1576104534
}

但上面说签名无效。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-12 06:56:36

验证意味着,根据创建令牌时使用的相同的密钥(在对称标线(如HS256)的情况下)检查签名。

在代码中使用方便函数

代码语言:javascript
复制
Keys.secretKeyFor(SignatureAlgorithm.HS256))

为给定的算法创建一个合适的密钥。但是,您不会在令牌创建方法中的任何位置保存密钥,并且在检查令牌时生成一个新的密钥。一定会失败的。

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

此外,当您在jwt.io上检查令牌时,需要在右侧列的“Verfify签名”下的输入字段中提供用于创建的键。如果不知道密钥,签名就无法验证。

在任何实际使用场景中,您都不会为每个令牌创建一个新密钥,而是有一个您可能已经存储在服务器端的密钥。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59296293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档