基于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
相关产品推荐
相关产品推荐

