一般Web应用开发验证用户信息有两种方式,一是使用session,二是使用token。
为什么要用Token
- Token无需存储降低服务器成本,session是将用户信息存储在服务器中的,当用户量增大时服务器的压力也会随着增大。
- 防御CSRF跨站伪造请求攻击,session是基于cookie进行用户识别的, cookie如果被截获,用户信息就容易泄露。
- 扩展性强,session需要存储无法共享,当搭建了多个服务器时其他服务器无法获取到session中的验证数据用户无法验证成功。而Token可以实现服务器间共享,这样不管哪里都可以访问到。
- Token可以减轻服务器的压力,减少频繁的查询数据库。
- 适用于移动平台应用
基于 Token 的身份验证流程
- 客户端使用用户名跟密码请求登录
- 服务端收到请求开始验证用户名与密码
- 验证成功后,服务端生成一个 Token并把这个 Token 发送给客户端
- 客户端收到 Token 以后可以把它存储起来,可以存放在 Cookie 里或者 Local Storage 里
- 客户端再次向服务端请求资形式源的时候携带服务端生成的 Token发送给服务器
- 服务端收到请求,然后去验证客户端请求里面携带的 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"