Java - Auth0 JWT验证 - 这样做对吗?

问题描述 投票:6回答:1

我正在设置一个REST API,用Auth0作为认证服务。 一切都在工作,但在发生了一个相当奇怪的事件后,我的信心有点动摇。

我的实现是基于示例代码的 此处 (RS256部分)和 此处. 唯一的修改是,我把 PublicKey 到一个 RSAPublicKey.

问题是,我想确定验证会在错误的签名上失败。 我修改了签名的最后一个字符(我们就说是 "x"),令牌仍然可以验证。 但是 - 换成任何字符 以外 "x "或最初生成的字符导致它如预期般失败。

我怀疑这是由于某种paddingencodingdecodingBase64的问题,而我只是碰巧选择了一个具有相同前n位数的字符或其他什么? 当然,这意味着,如果要成功地 "猜测",就需要包括token剩余的40-kabillion字符--这是它存在的全部意义。 所以我并不担心令牌会被猜中--我只是想确保我正确地实现了验证的要点。

import com.auth0.jwk.Jwk;
import com.auth0.jwk.JwkException;
import com.auth0.jwk.JwkProvider;
import com.auth0.jwk.UrlJwkProvider;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.security.interfaces.RSAPublicKey;

public class Application {
    public static void main(String[] args) {

        try {
            JwkProvider provider = new UrlJwkProvider("<my-provider>");
            Jwk jwk = provider.get("<my-key-id>");

            String token = "<some-token-passed-from-client>";
            RSAPublicKey publicKey = (RSAPublicKey) jwk.getPublicKey();

            Algorithm algorithm = Algorithm.RSA256(publicKey, null);
            JWTVerifier verifier = JWT.require(algorithm)
                    .withIssuer("<my-issuer>")
                    .build();
            DecodedJWT jwt = verifier.verify(token);

        } catch (JWTVerificationException exception) {
            System.out.println("JWT Exception: " + exception.getMessage());
        } catch (JwkException e) {
            e.printStackTrace();
        }

    }
}
java rsa jwt auth0
1个回答
0
投票

请看一下 JWT实例 (截图如下)。

令牌有3个不同颜色的部分。

  • 头部: 关于令牌的元数据,包括使用的算法。未签名也未验证。
  • 有效载荷: 令牌的内容(用户要求)。签名并核实。
  • 签字: 标识的签名。

特别是头文件没有签名,它们几乎可以包含任何内容,并可以被更改。虽然如果令牌有问题(例如算法值不好),它将无法被解码。

有一些规则可以将这些数据一起编码、填充和序列化,参考规范。可以在一个令牌中添加removeedit几个字节,但仍然是一个有效的令牌,尽管略有不同(修改了填充或头)。然而,它不可能改变令牌的有效载荷,这才是最重要的。

JWT库提供了单独的函数来从token中提取信息,例如 get_unverified_headers()get_claims(),避免任何潜在的混淆。假设一个人意外地从头部而不是从有效载荷中读取用户标识符,这将是一个严重的漏洞,因为它可以被随意更改。

sample of JWT token

© www.soinside.com 2019 - 2024. All rights reserved.