【问题标题】:DFR simple jwt get authToken from a user instance instead of username/passwordDFR 简单 jwt 从用户实例而不是用户名/密码获取 authToken
【发布时间】:2021-02-25 05:25:10
【问题描述】:

我有一个简单的聊天应用程序,其中的身份验证就像 whatsapp 一样工作

获取电话号码 => 如果不存在则创建一个 else 跳过 => 发送验证码并将其设置为用户模型中的“phone_code”字段 => 如果验证,最后删除“phone_code”

该应用程序是在 React Native 中构建的,使用 Rest 框架作为 API,我是新手,我正在努力在没有密码的情况下获取身份验证令牌。我使用 djangorestframework-simplejwt

我的注册视图:

@api_view(('POST',))
def register(request):
    if request.method == 'POST':
        serializer = UserSerializer(data=request.data)
        if not serializer.is_valid():
            if 'is not valid' in serializer.errors['phone_number'][0]:
                return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
        phone_number = serializer.initial_data['phone_number'].replace(' ', '')
        try:
            user = User.objects.get(phone_number=phone_number)
        except User.DoesNotExist:
            user = User.objects.create_user(
                phone_number=phone_number, username=phone_number)
        user.phone_code = randint(99999, 999999)
        user.save()
        TokenObtainPairView()
        return Response(serializer.data, status.HTTP_200_OK)
        # todo send validation code, I will handle later

我的登录视图(Chich 验证验证码)

@api_view(['POST',])
def loginuser(request):
    if request.method == 'POST':
        phone_number = request.data.get('phone_number')
        try:
            user = User.objects.get(phone_number=phone_number)
            if int(request.data.get('phone_code')) == user.phone_code and user.phone_code:
                user.phone_code = None
                user.save()
                #!!!!!!!!!!!!!!!!!!!NOW HOW CAN I GET THE JWT AUTHENTICATION TOKEN AND SEND IT TO MY REACT NATIVE APP?!
                return JsonResponse({'phone_number': phone_number}, status=200)

            else:
                return JsonResponse({'error': "Invalid code"}, status=400)
        except Exception as error:
                return JsonResponse({'error': error}, status=500)

当用户验证他的电话号码时,我如何发送 jwt 格式的身份验证令牌和响应?

urls.py:

path('api/token/', users_views.ObtainToken.as_view(), name='token_obtain_pair'),

我的自定义获取令牌视图:

class ObtainToken(TokenObtainPairView):
    permission_classes = (AllowAny,)
    serializer_class = MyTokenObtainPairSerializer

我还发现,当我使用 Postman 时,如果我发送一个空密码,系统会给出一个身份验证令牌。我会很感激任何帮助,谢谢

【问题讨论】:

    标签: javascript django react-native django-rest-framework django-rest-framework-jwt


    【解决方案1】:

    您的代码应该基于 rest_framework_simplejwt 的现有视图和序列化程序:使用 TokenObtainPairView 是一个好的开始,请保持这一点。

    那么在你的 seriliazer_class,MyTokenObtainPairSerializer,你应该使用TokenObtainSerializer

    class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    
        def validate(self, attrs):
            self.user = User.objects.get(phone_number=phone_number)
            # Do the verification with the phone_code here, if error, return a response with an error status code
    
            refresh = self.get_token(self.user)
    
            data['refresh'] = text_type(refresh)
            data['access'] = text_type(refresh.access_token)
    
            return data
    

    【讨论】:

      猜你喜欢
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2017-03-19
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多