使用 Python 在 Java 中创建的 JWT 令牌
Use JWT Token created by Python in Java
我有一个有趣的问题。
我将 python 与 Flask 一起用于身份验证服务,它使用 flask_jwt_extended 生成 JWT 令牌。
这就是我在 Python 中使用 Flask JWT Extended 生成令牌的方式。
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)
在配置中我指定了 JWT 密钥和 JWT 算法:
JWT_SECRET_KEY = "this-really-needs-to-be-changed"
JWT_ALGORITHM = "HS256"
在 Java 中,我使用 jjwt 库(io.jsonwebtoken、jjwt、0.9.0)来解码我制作的 JWT:
Claims userJWT = Jwts.parser()
.setSigningKey("this-really-needs-to-be-changed")
.parseClaimsJwt(token)
.getBody();
但是在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]
可能是密钥的编码问题,因为您的 java 库需要 base64 编码的密钥。参见 DefaultJwtParser
public JwtParser setSigningKey(String base64EncodedKeyBytes) {
请试试这个:
Claims userJWT = Jwts.parser()
.setSigningKey(Base64.getEncoder().encodeToString("this-really-needs-to-be-changed"))
.parseClaimsJwt(token)
.getBody();
我有一个有趣的问题。 我将 python 与 Flask 一起用于身份验证服务,它使用 flask_jwt_extended 生成 JWT 令牌。 这就是我在 Python 中使用 Flask JWT Extended 生成令牌的方式。
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)
在配置中我指定了 JWT 密钥和 JWT 算法:
JWT_SECRET_KEY = "this-really-needs-to-be-changed"
JWT_ALGORITHM = "HS256"
在 Java 中,我使用 jjwt 库(io.jsonwebtoken、jjwt、0.9.0)来解码我制作的 JWT:
Claims userJWT = Jwts.parser()
.setSigningKey("this-really-needs-to-be-changed")
.parseClaimsJwt(token)
.getBody();
但是在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]
可能是密钥的编码问题,因为您的 java 库需要 base64 编码的密钥。参见 DefaultJwtParser
public JwtParser setSigningKey(String base64EncodedKeyBytes) {
请试试这个:
Claims userJWT = Jwts.parser()
.setSigningKey(Base64.getEncoder().encodeToString("this-really-needs-to-be-changed"))
.parseClaimsJwt(token)
.getBody();