Jwt 认证

JWT 全称 Json web token,是一种开发的行业标准,它用于安全的表示双方间的声明,目前jwt主要用于系统的用户认证,特别是前后端分享项目。

它的过程如下:

在项目开发中,一般上按照上图所示的过程进行认证,即:用户登陆成功之后,注意,第一次请求时是没有token,只验证账号密码,验证成功后,服务端给用户浏览器返回一个token,以后用户浏览器要携带token再向服务器发送请求时,服务端校验token合法性,以及超时时间,合法则返回数据,否则返回一些状态信息,错误信息。

jwt与传统token的区别?

传统token方式:

用户登陆成功后,服务端生成一个随机token给用户,并且在服务端(数据库或者缓存)中保存一份token,以后用户再来访问时需要携带token,服务端接收到token后,去数据库或者缓存中进去检验token是否超时,是否合法。

 

jwt方式:

用户登陆成功后,服务端通过jwt生成一个随机token给用户(服务端并不保存token),以后用户再来访问时携带token,服务端接收到token通过jwt对token进行合法性,超时校验

可以看到jwt的优势在于:

数据只保存在客户端(浏览器),不需要数据库查询扣件。安全性。有超时时间验证(传统token也可在数据库中进行时间校验)

但jwt也存在一点问题,在超时时间内,token都是合法的,无法手动使其失效,因为服务端并没有保存数据。

 

jwt原理:

jwt生成的token由三部分,由两个点隔开。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikpva
G4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

生成规则如下:

第一部分Header,它包含算法信息和token类型,对此json数据进行base64url加密,形成token的第一段字符串。

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

第二段payload(负载,携带请求信息)部分,包含请求的用户信息,超时时间,对此json进行base64url加密,形成token的第二段字符串。

{
 "name": "John Doe",
 "password":"123",
 "delt": 1516239022
 ...
}

第三段Signature部分,把前再做的base密文通过.(点号)拼接起来,然后对其进行HS256加密,再对hs256密文进行base64url加密,最终得到token的第三段。

base64url(
 HMACSHA256(
 base64UrlEncode(header) + "." + base64UrlEncode(payload),
 your-256-bit-secret 
 )
)

默认情况下,这个加盐是django项目的secret_key.

再然后通过.将三段字符串连接起来,即形成了token

base64url加密是先做base64加密,然后再将-替代+及——替代/

 

上一篇:python 异常

下一篇:Django restframework 权限