使用 otp 获取 api 令牌的 Django REST 框架的 JWT 身份验证

Posted

技术标签:

【中文标题】使用 otp 获取 api 令牌的 Django REST 框架的 JWT 身份验证【英文标题】:JWT Authentication with Django REST Framework using otp for getting api tokens 【发布时间】:2021-07-06 10:11:57 【问题描述】:

我有一个自定义用户登录,我使用移动 OTP 验证,并且在我的项目中根本不使用任何 django 用户模型。需要通过 otp 对 jwt django restframework 进行身份验证。请帮我解决一下这个。 谢谢

【问题讨论】:

你可以展示你的代码,你想要做什么 【参考方案1】:

首先发送 otp 并将其保存到数据库中。

class LoginView(APIView):
    def post(self, request, format=None):
        data = request.data
        response = Response()       
        username = data.get('username', None)
        password = data.get('password', None)
        user = authenticate(username=username,password=password)
        if user is not None:
            if user.is_active:
                if user.two_step_verification:

                    GENERATE OTP HERE AND SAVE THIS IN USER MODEL...

                    user.otp = 'YOUR OTP'
                    user.save(update_fields=['otp',]) 
                    
                    SEND OTP HERE...                       
             
                    return Response("send":"Two step verification OTP successfully send!!!",status = status.HTTP_200_OK) 
            else:
                return Response("No active" : "This account is not active!!",status=status.HTTP_404_NOT_FOUND)
        else:
            return Response("Invalid" : "Invalid username or password!!",status=status.HTTP_404_NOT_FOUND)

然后验证这一点。 这里我使用rest_framework_simplejwt

from rest_framework_simplejwt.tokens import RefreshToken

@api_view(['POST'])
@permission_classes([AllowAny,])
def two_step_otp_Verify(request,otp):
    try:
        user = User.objects.get(otp = otp,is_active = True)
        verify = 'VERIFY YOUR OTP HERE'
        if verify:
            response = Response()
            user.otp = None
            user.last_login = timezone.now()
            user.save()
            refresh = RefreshToken.for_user(user)
            
            response.set_signed_cookie(
                       key = 'ACCESS_TOKEN', 
                       value = str(refresh.access_token),
                       .....
                       )
            #ORRRRRRRRRRRRRRRRRRRRRRR
            login(request, user)
            
            response.data = "Success" : "Login successfully"
            return response
        else:
            return Response("Time out" : "Given otp is expired!!", status=status.HTTP_408_REQUEST_TIMEOUT)
    except:
        return Response("No User" : "Invalid otp OR No any active user found for given otp", status=status.HTTP_400_BAD_REQUEST)

【讨论】:

以上是关于使用 otp 获取 api 令牌的 Django REST 框架的 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Cowin api 获取受益人问题

如何从 Django 在前端获取 CSRF 令牌以及如何在 Postman 中使用它

使用 Alamofire 时如何将令牌存储在 NSUserDefault 中?

使用 SMS Retriever API Android 的 OTP/SMS 自动获取问题

在 Chrome 扩展程序中安全地存储 Django REST API 令牌

从 Django Rest Framework 中的令牌获取经过身份验证的用户