1.JWT鉴权是什么?
①针对于浏览器而言
传统方式下,我们登录成功后可以将登录信息存储在session中,然后服务器会将sessionId标识返回给浏览器存储在cookie里,然后浏览器每次访问服务器的时候,都会通过cookie携带sessionId,后端通过sessionId就能取到session中的用户信息了
②针对于app/小程序而言
一个App,它是不支持cookie的;那么这种情况下,服务器如何来完成客户端的身份认定呢?这就需要JWT技术的支持了
JWT(令牌),全称为JSON Web token,是用于对应用程序上的用户进行身份验证的标记。
在身份验证过程中, 当用户使用其凭据成功登录时,将返回JWT(令牌),客户端会将其保存到本地存储中,而后每次请求都会携带此令牌。
2.JWT组成
完整的token令牌:
eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInRlbGVwaG9uZSI6IjEzNzAwMTM3MDAwIiwicGFzc3dvcmQiOm51bGx9.bK41N48SXyXf4lyccrAVeV-80btL5GtYZy2o5vwCX7A
①header头部
一般由两部分组成,令牌类型(即:JWT)和散列算法(HMAC、RSASSA、RSASSA-PSS等)
eyJhbGciOiJIUzI1NiJ9
去base64解码网站进行解码:
{"alg":"HS256"}
②payload载荷
一般里面可以存储自定义的实体的信息
eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInRlbGVwaG9uZSI6IjEzNzAwMTM3MDAwIiwicGFzc3dvcmQiOm51bGx9
去base64解码网站进行解码:
{"id":1,"username":"admin","telephone":"13700137000","password":null}
③signature签名
用于保证消息在传输过程中不会被篡改,由三部分组成
- header (base64后的)
- payload (base64后的)
- secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
3.JWT流程
token必须要在每次请求时传递给服务端,它应该保存在请求头里!!!