vue+django前后端分离权限控制之django权限控制

为什么要使用vue+jwt?

原来项目是使用原生html+css+jquery开发,每次访问网站都会加载全部文件,登录后根据权限内容显示对应权限的页面。这样会导致访问时间变长,而且页面切换很麻烦。
使用vue可以进行数据绑定,一旦数据发生改变,可以更快地展示出来,vue系列的一些组件(称为vue全家桶)如vue-router,vuex等可以对项目有很好的扩展。

后端权限认证

django中的权限认证token和jwt实操记录
jwt(json web token),主要用于用户认证(前后端分离/微信小程序/app开发)

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC
7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JSON Web Token(JWT)是一个基于 RFC 7519 的开放数据标准,它定义了一种宽松且紧凑的数据组合方式,使用 JSON 对象在各应用之间传输加密信息。该 JSON 对象可以通过数字签名进行鉴签和校验,一般地,JWT 可以采用 HMAC 算法,RSA 或者 ECDSA 的公钥/私钥对数据进行签名操作。

一个 JWT 通常有 HEADER (头),PAYLOAD (有效载荷)和 SIGNATURE (签名)三个部分组成,三者之间使用“.”链接,格式如下:
header.payload.signature
vue+django前后端分离权限控制之django权限控制_第1张图片

基于传统的token认证

  • 用户登录,服务端给返回token,并将token保存在服务端(每一次登录都会有刷新出一个新的token)也可以再加一个失效日期判断字段,实现对token的控制。
  • 以后用户再来访问时,需要携带token,服务端获取token后,再去数据库中获取token进行校验。

jwt

  • 用户登录,服务端给用户返回一个token(服务器不保存)
  • 以后用户再来访问,需要携带token,服务端获取token后,再做token的校验
  • 优势:相较于传统的token,它无需在服务器端保存token

jwt具体实现过程:

  1. 用户提交用户名和密码给服务器,如果登录成功,使用jwt创建一个token,并给用户返回。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9l
IiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

注意:jwt生成的token是由三段字符串组成,并且用.连接起来。

  • 第一段字符串HEADER,内部包含算法/token类型
    json转化成字符串,然后做base64url加密(base64加密;url连接用 - 替代 + 及 _ 替代 /)如:
{
  "alg": "HS256",
  "typ": "JWT"
}
  • 第二段字符串.payload,自定义值。
    json转化成字符串,然后做base64url加密(base64加密;url连接用 - 替代 + 及 _ 替代 /)
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022   #超时时间
}
  • 第三段字符串:

    第一步:第一,二部分密文拼接起来
    
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiw
ibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
     第二步:对前2部分密文进行HS256加密 + 加盐(加盐是指服务端本身有一字符串,加密时加入)
     第三步: 对HS256加密后的密文再做base64url加密 
  1. 以后用户再来访问的时候,需要携带token,后端需要对token进行校验
- 获取token
- 第一步:对token进行切割
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3OD
kwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.Sf
lKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- 第二步,对第二段进行base64url解密,并获取payload信息,检测token是否已经超时?
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
- 第三步:把第12端拼接,再次执行sha256加密 
    --第一步:12部分密文拼接起来
   eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3OD
kwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
	--第二步:对前2部分密文进行HS256加密+加盐
	密文 = base64解密(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c)
	如果相等,表示token未被修改过。(认证通过)

应用

pip install pyjwt
pyjwt.encode 生成token
pyjwt.decode token解密

扩展

pip install djangorestframework-jwt:基于pyjwt做了一些封装
建议使用pyjwt,学会了pyjwt,其他框架都会使用了

你可能感兴趣的:(Django,python,jwt,vue,django)