检查承载令牌是否为jwt

时间:2020-07-06 06:44:26

标签: java spring-boot jwt

我有两种用于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");
      }
    }
}

,但无法正常工作。有图书馆吗?还是可以修改上面的正则表达式?

4 个答案:

答案 0 :(得分:2)

您可以采用其他方法。 JWT令牌包括三部分:头信息,包含类型和算法,有效负载和签名。标头和正文部分是Base64编码的。如果您解码标题部分,则将标记类型。

在您的示例令牌中,eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1MTYyMzkwMjJ9tbD.epxpstvGdW8TC3G8zg4B6rUYAOvfzdceoH48wgRQ

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

答案 1 :(得分:1)

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

  • 检查jwt是否可以用“。”分隔。分为三部分(标题,有效负载,签名)
  • 检查标题(如果它可以被base64解码)
  • 检查已解码标头中的令牌类型(如果是jwt)

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

例如:

{“ alg”:“ HS256”,“ typ”:“ JWT”}然后,此JSON为Base64Url 进行编码以形成JWT的第一部分。

https://jwt.io/introduction/

答案 2 :(得分:0)

following regexp似乎可以正常工作:

    String pattern = "^[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_.+/=]*$";

答案 3 :(得分:0)

此正则表达式应该起作用:

String pattern="^[A-Za-z0-9\\-_=]+\\.[A-Za-z0-9\\-_=]+(\\.[A-Za-z0-9\\-_.+/=]+)?$";
相关问题