使用Java在Java中创建的JWT令牌

gho*_*vat 5 python java jwt flask-jwt-extended

我有一个有趣的问题.我将python与Flask一起用于身份验证服务,该服务使用flask_jwt_extended生成JWT令牌.这就是我如何使用Flask JWT Extended在Python中生成令牌.

identity = {
        "firstname": user.firstname,
        "lastname": user.lastname,
        "email": user.email,
        "uuid": user.user_uuid,
        'user_id': user.id
    }
access_token = create_access_token(identity=identity, fresh=True)
Run Code Online (Sandbox Code Playgroud)

在配置中,我指定了JWT密钥和JWT算法:

JWT_SECRET_KEY = "this-really-needs-to-be-changed"
JWT_ALGORITHM = "HS256"
Run Code Online (Sandbox Code Playgroud)

在Java中,我使用jjwt库(io.jsonwebtoken,jjwt,0.9.0)来解码我制作的JWT:

Claims userJWT = Jwts.parser()
                    .setSigningKey("this-really-needs-to-be-changed")
                    .parseClaimsJwt(token)
                    .getBody();
Run Code Online (Sandbox Code Playgroud)

但是在Java中我得到一个例外,如果我运行它,我真的不明白问题是什么,因为算法是相同的和令牌.

从几小时开始,我现在尝试弄清问题是什么,因为它对我没有意义,

例外:

  : JWT signature does not match locally computed signature. JWT validity cannot be asserted and should not be trusted.

io.jsonwebtoken.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:354) ~[jjwt-0.9.0.jar!/:0.9.0]
        at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:481) ~[jjwt-0.9.0.jar!/:0.9.0]
        at io.jsonwebtoken.impl.DefaultJwtParser.parseClaimsJws(DefaultJwtParser.java:541) ~[jjwt-0.9.0.jar!/:0.9.0]
Run Code Online (Sandbox Code Playgroud)

ped*_*ofb 2

可能是密钥的编码问题,因为您的 java 库需要 base64 编码的密钥。请参阅默认JwtParser

public JwtParser setSigningKey(String base64EncodedKeyBytes) {
Run Code Online (Sandbox Code Playgroud)

请尝试这个:

Claims userJWT = Jwts.parser()
                .setSigningKey(Base64.getEncoder().encodeToString("this-really-needs-to-be-changed"))
                .parseClaimsJwt(token)
                .getBody();
Run Code Online (Sandbox Code Playgroud)