djangorestframework-jwt使用,生成token,token认证
使用django的jwt模块: 安装:pip install djangorestframework-jwt配置:将djangorestframework-jwt注册到apps中settings.py下配置import datetimeJWT_AUTH = {'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),'JWT_AUTH_
使用django的jwt模块: 安装:pip install djangorestframework-jwt
配置:
将djangorestframework-jwt注册到apps中
INSTALLED_APPS = [ 'rest_framework_jwt',#djano_jwt ]
settings.py下配置
import datetime
JWT_AUTH = { 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_AUTH_HEADER_PREFIX': 'JWT', #前缀需要家jwt }
登录成功后生成token返回给前端:views.py
from rest_framework.viewsets import ViewSet #获取token def _get_token(user): from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler #传递用户对象,获取token payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) return token class UserView(ViewSet): #datail=True的时候,查询字符串携带pk @action(methods=['POST'],detail=False) def login(self,request,*args,**kwargs): username = request.data.get('username') password = request.data.get('password') user = models.User.objects.filter(username=username).first() ret = user.check_password(password) if ret: token = _get_token(user) return ApiResponse(msg='登录成功',code=100,data={'token':token,'username':username}) else: return ApiResponse(msg='用户名或密码错误',code=101)
前端携带token过来,进行认证,自己写认证:auth.py
from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed from rest_framework_jwt.serializers import jwt_decode_handler,jwt_get_username_from_payload import jwt class MyJWTAuthentication(BaseAuthentication): def authenticate(self, request): #前端是将token通过http请求头发送过来,且AUTHORIZATION:token token = request.META.get('HTTP_AUTHORIZATION') if token: #jwt通过了通过三段tokken,取出payload的方法,并且有校验功能 try: payload = jwt_decode_handler(token) username = payload.get('username') return (username,token) except jwt.ExpiredSignature: msg = 'token过期' raise AuthenticationFailed(msg) except jwt.DecodeError: msg='toke非法' raise AuthenticationFailed(msg) except jwt.InvalidTokenError: msg = '用户非法' raise AuthenticationFailed(msg) except Exception as e: msg=str(e) raise AuthenticationFailed(msg) raise AuthenticationFailed('你没有携带认证信息,说明情况')
写一个需要成功登录后才能访问的api:views.py
class UserShowView(APIView): #局部配置 authentication_classes = [authen.MyJWTAuthentication] # permission_classes = [IsAuthenticated] def get(self,request): token = request.auth user = request.user return ApiResponse(msg='token 认证成功',data={'token':token,'user':user})
使用postman测试:
登录,获取token
拿到token后,复制,携带token访问需要认证的api
token = request.META.get('HTTP_AUTHORIZATION')这里就是在获取前端携带的token,系统默认给key加上 HTTP_再拼接上AUTHORIZATION,作为后端获取token的key
生成token和解析token要使用配对的模块:
1、使用rest_framework_jwt.serializers
生成token需要的两个函数 from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler payload = jwt_payload_handler(用户对象) token = jwt_encode_handler(payload) 这样就生成token
解析token需要的函数 from rest_framework_jwt.serializers import jwt_decode_handler payload = jwt_decode_handler(token) #对前端发送过来的token进行解析,得到payload,这里其实就是一个字典 验证成功 return user,token 这个必须return 元组,且该元组是可以被视图函数所获取到 1、通过request.user 获取到元组的第一个元素 2、通过request.auth 获取到元组的第二个元素
2、生成token的可以使用
生成token的两个函数 from rest_framework_jwt.utils import jwt_payload_handler,jwt_encode_handler 解析token的一个函数: from rest_framework_jwt.authentication import jwt_decode_handler 其他使用方法都一样。
认证模块全局和局部配置:
全局配置:在settings.py下 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ #这个是我们自己写的认证类所在的位置 'studentSystemt.apps.user.authen.MyJWTAuthentication' ], } 局部配置: 在视图类中添加: class Home(): authentication_classes = [authen.MyJWTAuthentication]
更多推荐
所有评论(0)