检查承载令牌是否为 jwt

bha*_*anu 3 java jwt spring-boot

我有两种类型的令牌用于 http 请求。一种在授权标头中具有 JWT 令牌,另一种具有固定长度的 oauth 令牌。根据令牌的类型,我想执行一些操作。我如何区分它们?

我努力了

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main
{
    public static void main(String[] args) {

      String pattern="^[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.^[A-Za-z0-9-_.+/=]*$";
      String line="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1MTYyMzkwMjJ9tbD.epxpstvGdW8TC3G8zg4B6rUYAOvfzdceoH48wgRQ";
      Pattern r = Pattern.compile(pattern);
      Matcher m = r.matcher(line);
      if (m.find( )) {  //is jwt
         System.out.println("jwt token");
      }else {
         System.out.println("NOt jwt");
      }
    }
}

Run Code Online (Sandbox Code Playgroud)

但这并没有按预期工作。有没有这样做的图书馆?或者我们可以修改上面的正则表达式吗?

小智 7

您可以采用替代方法。JWT 令牌由三部分组成:包含类型和算法的标头信息、有效负载和签名。标头和正文部分采用 Base64 编码。如果您解码标头部分,您将标记类型。

从你的示例令牌是eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1MTYyMzkwMjJ9tbD.epxpstvGdW8TC3G8zg4B6rUYAOvfzdceoH48wgRQ

所以标头部分是 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 解码后您将得到{"alg":"HS256","typ":"JWT"} 从解码值您可以确定它是否是 jwt 令牌


小智 5

我认为我们可以通过以下方式检查令牌是否为 jwt:

  • 检查jwt是否可以被“.”分割 分为三部分(标头、有效负载、签名)
  • 检查 header 是否可以进行 base64 解码
  • 检查解码后的 header 中的 token 类型,是否为 jwt

标头通常由两部分组成:令牌的类型(JWT)和所使用的签名算法(例如 HMAC SHA256 或 RSA)。

例如:

{ "alg": "HS256", "typ": "JWT" } 然后,对该 JSON 进行 Base64Url 编码以形成 JWT 的第一部分。

https://jwt.io/介绍/