djangorestframework-jwt使用,生成token,token认证

使用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
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值