You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django REST的无密码OTP登录(Simple JWT)实现求助

问题解答

Knox完全可以解决你的问题,而且实现起来比自定义Simple JWT更简洁,不需要复杂的后端改造。

为什么Knox更适配你的场景?

Knox本身不强制绑定Django默认的用户名密码认证流程,它的核心功能是生成和管理令牌,你可以轻松基于OTP验证逻辑触发令牌发放,完全绕开密码校验环节。

最简实现步骤

  • 安装Knox:
    pip install django-rest-knox
    
  • 配置项目settings.py:
    将knox加入INSTALLED_APPS,同时配置REST框架的认证类:
    INSTALLED_APPS = [
        # 你的其他应用
        'rest_framework',
        'knox',
    ]
    
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'knox.auth.TokenAuthentication',
        ),
    }
    
  • 编写OTP登录视图:
    无需自定义认证后端,直接写视图处理OTP验证,验证通过后调用Knox的令牌生成方法即可:
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status
    from knox.models import AuthToken
    from .models import User  # 你的用户模型
    from .serializers import UserSerializer  # 你的用户序列化器
    
    class OTPLoginView(APIView):
        def post(self, request):
            phone_number = request.data.get('phone_number')
            otp_code = request.data.get('otp_code')
    
            # 这里替换成你的OTP验证逻辑,比如从缓存/数据库取对应OTP对比
            user = User.objects.filter(phone_number=phone_number).first()
            if not user or not self.validate_otp(user, otp_code):
                return Response({'error': '无效的OTP或手机号'}, status=status.HTTP_400_BAD_REQUEST)
    
            # 验证通过,生成Knox令牌
            token = AuthToken.objects.create(user)[1]
            return Response({
                'user': UserSerializer(user).data,
                'token': token
            })
    
        def validate_otp(self, user, otp_code):
            # 示例:用缓存存储OTP的验证逻辑
            from django.core.cache import cache
            stored_otp = cache.get(f"otp_{user.id}")
            return stored_otp == otp_code
    
  • 配置路由:
    在项目urls.py中添加OTP登录的路由:
    from django.urls import path
    from .views import OTPLoginView
    
    urlpatterns = [
        path('login/otp/', OTPLoginView.as_view(), name='otp-login'),
    ]
    

对比Simple JWT的优势

如果用Simple JWT,你需要自定义TokenObtainPairSerializer和对应视图,甚至可能要修改认证后端;而Knox的令牌生成逻辑完全独立,你只需要在OTP验证通过后调用生成方法即可,代码量更少,逻辑更直接。

内容的提问来源于stack exchange,提问作者Armin fatemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:13:13