我定制了django auth方法:
class MyBackend(ModelBackend):
def authenticate(self, request, phone=None, otp=None, **kwargs):
UserModel = get_user_model()
try:
user = UserModel.objects.get(phone=phone)
except UserModel.DoesNotExist:
return None
else:
if user.otp == otp:
# user.otp = None
# user.save()
return user
def get_user(self, phone):
UserModel = get_user_model()
try:
return UserModel.objects.get(phone=phone)
except UserModel.DoesNotExist:
return None
我的认证类:
class ValidateOTP(APIView):
def post(self, request):
phone = request.data.get('phone', None)
otp = request.data.get('otp', None)
if not phone or not otp:
return Response({'error': 'Wrong data.'}, status=status.HTTP_400_BAD_REQUEST)
user = authenticate(request, phone=phone, otp=otp)
login(request, user)
return Response({'Ok': 'ok'}, status=status.HTTP_200_OK)
使用邮递员,我通过端点创建用户http://127.0.0.1:8000/api/validate-otp/。一切都好。 但是当我尝试向另一个端点发送 GET 请求时,我的 request.user 是匿名的。
class UserInfo(APIView):
permission_classes = ([IsAuthenticated])
def get(self, request):
print(request.user)
return Response({'ok': 'ok'}, status=status.HTTP_200_OK)
可能出现什么问题?
SessionAuthentication
[drf-doc] 或自己实现一些类似会话的身份验证。登录信息附加到该会话,但下一个 HTTP 请求不会使用该会话:如果您使用基于会话的身份验证,则每次都需要随请求发送会话 ID。
像 OTP 这样的身份验证应该返回一个令牌,然后客户端可以将其用于(每个)请求,或者可能更改令牌,或者使用会话 ID,但用户登录因此会登录该用户的会话 ,所以如果你使用它,你将需要 API 和客户端来了解会话。