jwt方式进行登录验证

2022-08-17 13:35:53

一般Web应用开发验证用户信息有两种方式,一是使用session,二是使用token。

为什么要用Token

  1. Token无需存储降低服务器成本,session是将用户信息存储在服务器中的,当用户量增大时服务器的压力也会随着增大。
  2. 防御CSRF跨站伪造请求攻击,session是基于cookie进行用户识别的, cookie如果被截获,用户信息就容易泄露。
  3. 扩展性强,session需要存储无法共享,当搭建了多个服务器时其他服务器无法获取到session中的验证数据用户无法验证成功。而Token可以实现服务器间共享,这样不管哪里都可以访问到。
  4. Token可以减轻服务器的压力,减少频繁的查询数据库。
  5. 适用于移动平台应用

基于 Token 的身份验证流程

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求开始验证用户名与密码
  3. 验证成功后,服务端生成一个 Token并把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,可以存放在 Cookie 里或者 Local Storage 里
  5. 客户端再次向服务端请求资形式源的时候携带服务端生成的 Token发送给服务器
  6. 服务端收到请求,然后去验证客户端请求里面携带的 Token,如果验证成功,就向客户端返回请求的数据,否则拒绝请求。

Token的组成形式

JWT 标准的 Token 有三个部分(面试被问到过):

1. header(头部)

每个 Token 里面都有一个 header,也就是头部数据,里面包含了使用的算法告诉我们这个token 是否加密。如果是未加密的 Token ,这个属性可以设置成 none。

2. payload(数据)

Payload 里面是 Token 要包含的一些数据,内容可以自行定义,也可以参考标准字段(简写:全称)iss:Issuer、sub:Subject、exp:Expiration time、iat:Issued at。

3. signature(签名)

将Header和Playload使用Base64编码生成一下再加入签名字符用加密算法加密一遍,得到唯一的签名,用来防止其他人来篡改Token中的信息。

使用jwt

1. 安装django-rest-framework依赖包

pip install djangorestframework
pip install djangorestframework-jwt
pip install django-cors-headers

2. 配置settings.py文件

NSTALLED_APPS=[...'rest_framework','rest_framework.authtoken',# 设置token'corsheaders',...]
MIDDLEWARE=['corsheaders.middleware.CorsMiddleware',...]import datetime
JWT_AUTH={'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),#设置token过期时间'JWT_AUTH_HEADER_PREFIX':'JWT',}

3. 修改使用jwt验证的URL

#jwt中间件的三个方法分别是获取token,刷新token和验证token 登录验证就用获取token的obtain_jwt_tokenfrom rest_framework_jwt.viewsimport obtain_jwt_token,refresh_jwt_token,verify_jwt_token

url(r'^login/', obtain_jwt_token),

4. Views里设置token验证
前端需要将{Authorization: JWT token}保存在headers中传递到后端进行验证

classTestViewset(viewsets.ModelViewSet):# 标记需要进行jwt验证
    authentication_classes=(JSONWebTokenAuthentication, SessionAuthentication)# 权限验证
    permission_classes=(IsAuthenticated, IsOwnerOrReadOnly)
    serializer_class= TestSerializer
    lookup_field="test_id"
  • 作者:Hzy_han
  • 原文链接:https://blog.csdn.net/big_white_py/article/details/108721533
    更新时间:2022-08-17 13:35:53