测试开发进阶(三十一)
用户模块
Json Web Token认证
最常见的认证机制
保持在服务端,增加服务器开销
分布式架构中,难以维持Session会话同步
CSRF攻击风险(跨站请求)
Token认证
保存在客户端
跨语言,跨平台
扩展性强
鉴权性能高
JWT(Json Web Token)
由三部分组成
- header
声明类型
声明加密算法
base64加密,可以解密
- playload
存放过期时间,签发用户等
可以添加用户的非敏感信息
base64加密,可以解密
- signature
由三部分组成
使用base64加密之后的header + . + 使用base64加密之后的playload + 使用HS256算法加密,同时secret加盐处理
安装djangorestframework-jwt
1 | pip install djangorestframework-jwt |
使用
在setting.py
中添加
1 | REST_FRAMEWORK = { |
添加路由
用户处:user/urls.py
1 | from django.urls import path |
主路由:
ApiTest/urls.py
1 | urlpatterns = [ |
不登录的访问
登录后的返回内容
1 | HTTP 200 OK |
1 | import base64 |
认证过期时间
./site-packages/rest_framework_jwt/settings.py
第40行
1 | 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300), |
Token默认过期时间5分钟
自行修改过期时间ApiTest/settings.py
过期时间为1天
1 | JWT_AUTH = { |
请求Token 头
1 | 'JWT_AUTH_HEADER_PREFIX': 'JWT', |
使用httpie发起包含token的内容
安装httpie-jwt-auth
插件
1 | export JWT_AUTH_TOKEN='你的token' |
修改载荷
1 | def jwt_response_payload_handler(token, user=None, request=None): |
在utils/jwt_handler.py
重写
1 | def jwt_response_payload_handler(token, user=None, request=None): |
1 | JWT_AUTH = { |
Django自带的用户模型
django.contrib.auth.models.User
查看settings.py可以发现,默认注册了django.contrib.auth
注册
- 用户名(6-20位,不重复)
- 邮箱(符合邮箱格式)
- 密码(6-20位,和确认密码一致)
- 确认密码(6-20位,和密码一致)
user/serializers.py
1 | from rest_framework import serializers |
user/urls.py
1 | from django.urls import path |
user/views.py
1 | from rest_framework.generics import CreateAPIView |