JWT 实现token验证

it2024-01-12  68

1. 什么是JWT

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用 户和服务器之间传递安全可靠的信息。一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

头部(Header) 头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以 被表示成一个JSON对象。

{"typ":"JWT","alg":"HS256"}

在头部指明了签名算法是HS256算法。 我们进行BASE64编 码http://base64.xpcha.com/,编码后的字符串如下: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

载荷(playload) 载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包

签证(signature) jwt的第三部分是一个签证信息,这个签证信息由三部分组成: header (base64后的) payload (base64后的) secret 这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符 串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第 三部分。

注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用 来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流 露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了

2. Token Auth

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是 这样的:

客户端使用用户名跟密码请求登录服务端收到请求,去验证用户名与密码验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里客户端每次向服务端请求资源的时候需要带着服务端签发的 Token服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向 客户端返回请求的数据

3. Java的JJWT实现JWT

JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界 面,隐藏了它的大部分复杂性

创建maven工程,导入依赖 <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.6.0</version> </dependency> 创建类CreateJwtTest

设置密匙不要太短,否则抛出如下异常

Exception in thread "main" java.lang.IllegalArgumentException: secret key byte array cannot be null or empty. import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class CreateJwtTest { public static void main(String[] args) { JwtBuilder jwtBuilder = Jwts.builder(). setId("2017"). setIssuedAt(new Date()). //签发时间 setSubject("小明"). //主题 signWith(SignatureAlgorithm.HS256, "qstsss"); //签名算法以及密匙 System.out.println(jwtBuilder.compact()); } }

输出如下

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyMDE3IiwiaWF0IjoxNjAzMjQ1Nzc5LCJzdWIiOiLlsI_mmI4ifQ.wsXx7Obm0TPh9JpJHDKpVQtAAaS9OOZHKz_YqcL9UNo token解析 @Test public void test(){ String token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyMDE3IiwiaWF0IjoxNjAzMjQ1Nzc5LCJzdWIiOiLlsI_mmI4ifQ.wsXx7Obm0TPh9JpJHDKpVQtAAaS9OOZHKz_YqcL9UNo"; Claims claims = Jwts.parser().setSigningKey("qstsss").parseClaimsJws(token).getBody(); System.out.println(claims.getId()); }
最新回复(0)