Использовать токен JWT, созданный Python в Java
У меня интересный вопрос. Я использую Python с Flask для службы аутентификации, которая генерирует токены JWT с flask_jwt_extended. Вот как я генерирую токены в 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]
1 ответ
Вероятно, это проблема кодирования с ключами, потому что вашей 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();