【问题标题】:Use JWT Token created by Python in Java在 Java 中使用 Python 创建的 JWT Token
【发布时间】:2018-09-02 15:47:12
【问题描述】:

我有一个有趣的问题。 我将 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]

【问题讨论】:

  • 什么异常?
  • @OliverCharlesworth 抱歉 _ 忘记添加了。现在将其添加到原始问题中
  • 该错误与 Python 无关。 Java 9 中已弃用 Java 类 javax.xml.bind.DatatypeConverter。请检查您的 Java 版本。
  • 感谢我添加了解决 XML 绑定问题的 jaxb-api

标签: java python jwt flask-jwt-extended


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 2015-06-29
    • 2021-11-01
    • 2017-03-02
    • 2020-03-17
    • 2014-07-11
    • 2019-12-04
    • 2020-01-22
    相关资源
    最近更新 更多