Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST框架需要哈希密码才能登录_Python_Django_Django Rest Framework_Jwt - Fatal编程技术网

Python Django REST框架需要哈希密码才能登录

Python Django REST框架需要哈希密码才能登录,python,django,django-rest-framework,jwt,Python,Django,Django Rest Framework,Jwt,Django要求我发送散列密码以获取JWT令牌。当我通过邮递员发送以下请求时,我得到一个“CustomUser匹配查询不存在”错误 但是,我可以使用哈希密码运行代码(从管理员处查找密码后),它返回正确的值。如何在发送密码之前发送未加密的密码或散列密码 我使用的是一个自定义用户模型,用电子邮件代替用户名。我尝试使用request.META.get(“用户名”)和request.META.get(“密码”)将我的代码指向标题,但我收到一个“字段必填”错误。在将密码发送到API之前,我还试图找出如何在

Django要求我发送散列密码以获取JWT令牌。当我通过邮递员发送以下请求时,我得到一个“CustomUser匹配查询不存在”错误

但是,我可以使用哈希密码运行代码(从管理员处查找密码后),它返回正确的值。如何在发送密码之前发送未加密的密码或散列密码

我使用的是一个自定义用户模型,用电子邮件代替用户名。我尝试使用
request.META.get(“用户名”)
request.META.get(“密码”)
将我的代码指向标题,但我收到一个“字段必填”错误。在将密码发送到API之前,我还试图找出如何在应用程序上散列密码,但我没有找到一个有效的方法

我对处理该请求有以下看法

@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def login(request):
    username = request.data.get('username')
    password = request.data.get('password') 
    if username is None or password is None:
        return Response({'error': 'Please provide your username and password'}, status=HTTP_400_BAD_REQUEST)
    user = authenticate(email=username, password=password)

    if not user:
        return Response({'error': 'Invalid Credentials'},status=HTTP_404_NOT_FOUND)
    token, _ = Token.objects.get_or_create(user=user)
    return Response({'token': token.key}, status=HTTP_200_OK)
我希望得到一个JWT令牌,但得到的不是“CustomUser matching query不存在”就是“field required”

编辑------添加我的自定义模型---


我解决了我的问题。在实现JWT时,我将Django的默认版本身份验证留在了在线状态。我决定删除JWT en,而不是对所有内容进行返工。它现在工作得很好

我解决了我的问题。在实现JWT时,我将Django的默认版本身份验证留在了在线状态。我决定删除JWT en,而不是对所有内容进行返工。它现在工作得很好

你不应该通过
request.data.get('email')
和调用
user=authenticate(username=username,password=password)
来获取用户名吗?当我这样做并通过下面的JSON包时,我仍然会遇到“匹配查询”问题<代码>{“用户”:{“电子邮件”:me@mysite.com“,”用户名“:”myuser“,”密码“:”mypass“}}您是否使用自定义身份验证后端?因为django应该在前端散列密码而不是你,如果你不这样做,请添加你的自定义用户模型,以便我们可以帮助你better@mmoallemi99我在上面添加了自定义用户模型。@Squ3lchr将您的UserManager类添加到您不应该通过
request.data.get('email')
和call
user=authenticate获取用户名吗(username=username,password=password)
?当我这样做并通过以下JSON包时,我仍然会遇到“匹配查询”问题。
{“user”:{“email”:me@mysite.com,“用户名”:“我的用户”,“密码”:“我的通行证”}
您使用的是自定义身份验证后端吗?因为django应该在前端散列密码,如果您不这样做,请添加自定义用户模型,以便我们可以帮助您better@mmoallemi99我在上面添加了自定义用户模型。@Squ3lchr也添加您的UserManager类
@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def login(request):
    username = request.data.get('username')
    password = request.data.get('password') 
    if username is None or password is None:
        return Response({'error': 'Please provide your username and password'}, status=HTTP_400_BAD_REQUEST)
    user = authenticate(email=username, password=password)

    if not user:
        return Response({'error': 'Invalid Credentials'},status=HTTP_404_NOT_FOUND)
    token, _ = Token.objects.get_or_create(user=user)
    return Response({'token': token.key}, status=HTTP_200_OK)
import jwt

from datetime import datetime, timedelta

from django.conf import settings
from django.contrib.auth.models import (
    AbstractBaseUser, BaseUserManager, PermissionsMixin
)
from django.db import models

class UserManager(BaseUserManager):

    def create_user(self, username, email, password=None):

        if username is None:
            raise TypeError('Users must have a username')
        if email is None:
            raise TypeError('Users must have an email address')
        user = self.model(username=username, email=self.normalize_email(email))
        user.set_password(password)
        user.save()

        return user

    def create_superuser(self, username, email, password):
        if password is None:
            raise TypeError('Superusers must have a password')

        user = self.create_user(username, email, password)

        user.is_superuser = True
        user.is_staff = True
        user.save()

        return user
class CustomUser(AbstractBaseUser, PermissionsMixin):

    username = models.CharField(db_index=True, max_length=255, unique = True)
    email = models.EmailField(db_index=True, unique=True)

    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

    def __str__(self):
        return self.email

    @property
    def token(self):
        return self._generate_jwt_token()

    def get_full_name(self):
        return self.username

    def get_short_name(self):

        return self.username

    def _generate_jwt_token(self):

        dt = datetime.now()
        expr = dt + timedelta(days=60)
        dtt = int(expr.timestamp())
        token = jwt.encode({
            'id':self.pk,
            'exp': dtt,
        }, settings.SECRET_KEY, algorithm='HS256')
        return token.decode('utf-8')