Django-rest-framework(DRF)如何实现自定义认证

一、创建自定义类

python 复制代码
import datetime
from django.conf import settings
from rest_framework.authentication import BasicAuthentication
from rest_framework.exceptions import AuthenticationFailed
from base.models import User
import jwt
from jwt import exceptions


def create_token(payload):  # 创建token
    salt = settings.SECRET_KEY
    headers = {
        'typ': 'jwt',
        'alg': 'HS256',
    }
    payload['exp'] = datetime.datetime.utcnow() + datetime.timedelta(minutes=3)  # 设置token的有效时间
    token = jwt.encode(payload=payload, key=salt, headers=headers, algorithm='HS256')
    return token


class MyAuthentication(BasicAuthentication):  #继承基础的认证类
    def authenticate(self, request):
        token = request.META.get('HTTP_AUTHORIZATION')
        if token:
            salt = settings.SECRET_KEY
            payload = None
            try:
                payload = jwt.decode(token, salt, algorithms='HS256', verify=True)
            except exceptions.ExpiredSignatureError:
                raise AuthenticationFailed({'code': '1000', 'msg': 'token已经失效'})
            except jwt.DecodeError:
                raise AuthenticationFailed({'code': '1001', 'msg': 'token认证失败'})
            except jwt.InvalidTokenError:
                raise AuthenticationFailed({'code': '1002', 'msg': '非法的token'})
            user_objects = User.objects.filter(username=payload['user']['username']).first()
            return user_objects, token
        else:
            raise AuthenticationFailed({'code': '1003', 'msg': '没有获取到token'})

    def authenticate_header(self, request):
        return 'API'

二、全局使用

python 复制代码
REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None,
    'DEFAULT_AUTHENTICATION_CLASSES': ['utils.auth.MyAuthentication'],  # 全局使用,settings文件注册认证类
}
相关推荐
星星电灯猴2 分钟前
iOS 上架 H5 应用的可行性与实现路径,壳应用、合规要求与构建流程的技术分析
后端
qwepoilkjasd9 分钟前
订单事件消费者迁移方案 - 幂等性与可靠性设计
后端
用户23452670098237 分钟前
Python实现异步任务队列深度好文
后端·python
夫唯不争,故无尤也40 分钟前
PyTorch 的维度变形一站式入门
人工智能·pytorch·python
00后程序员1 小时前
如何防止 IPA 被反编译,从结构隐藏到符号混淆的多层防护方案
后端
熊猫钓鱼>_>1 小时前
从零开始构建RPG游戏战斗系统:实战心得与技术要点
开发语言·人工智能·经验分享·python·游戏·ai·qoder
SamDeepThinking1 小时前
在 MySQL 里,不建议使用长事务的根因
后端·mysql
文心快码BaiduComate1 小时前
用文心快码写个「隐私优先」的本地会议助手
前端·后端·程序员
BoBoZz191 小时前
TriangleStrip连续三角带
python·vtk·图形渲染·图形处理
生信大表哥1 小时前
Python单细胞分析-基于leiden算法的降维聚类
linux·python·算法·生信·数信院生信服务器·生信云服务器