【问题标题】:django authenticate not working with user created by api , only work with user created by admindjango 验证不适用于 api 创建的用户,仅适用于 admin 创建的用户
【发布时间】:2020-12-02 21:44:11
【问题描述】:

我正在尝试使用 drf 登录后生成令牌。我正在使用 emailbackend 使用电子邮件和密码登录,但它不能与 api 创建的用户和管理员创建的用户一起工作

后端.py:

class EmailBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
    UserModel = get_user_model()
    try:
        user = UserModel.objects.get(email=username)
    except UserModel.DoesNotExist:
        return None
    else:
        if user.check_password(password):
            return user
    return None

令牌序列化器:

class AuthCustomTokenSerializer(serializers.Serializer):
'''
Changing Token auth to use email instead username
'''
email = serializers.EmailField(label=_("Email"))
password = serializers.CharField(
    label=_("Password",),
    style={'input_type': 'password'},
    trim_whitespace=False
)

def validate(self, attrs):
    email = attrs.get('email')
    password = attrs.get('password')
    print(email, password)
    if email and password:
        user = authenticate(username=email, password=password)
        print("this is user", user)
        # The authenticate call simply returns None for is_active=False
        # users. (Assuming the default ModelBackend authentication
        # backend.)
        if not user:
            msg = _('Unable to log in with provided credentials.')
            raise serializers.ValidationError(msg, code='authorization')
    else:
        msg = _('Must include "username" and "password".')
        raise serializers.ValidationError(msg, code='authorization')

    attrs['user'] = user
    return attrs

登录视图:

@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def login(request):
    serializer = AuthCustomTokenSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = serializer.validated_data['user']
    token, _ = Token.objects.get_or_create(user=user)
    return Response({token: token.key}, status=status.HTTP_200_OK)

使用管理员登录:

通过api创建用户登录:

注册api:

【问题讨论】:

  • 什么是 Q ?
  • 验证功能不适用于由 api 创建的用户,但它与由管理员创建的用户一起使用
  • 但您只显示凭据序列/视图。显示你的代码:)
  • 也 - 不工作怎么办?显示你的错误。显示您的请求 ....etc 等
  • 查看编辑,它似乎从 AuthCustomTokenSerializer 上的 user = authenticate(username=email, password=password) 返回 None

标签: python-3.x django django-rest-framework


【解决方案1】:

谢谢,太好了。 这意味着authenticate(username=email, password=password) 不会返回用户。 你用调试器工作吗?或者可以添加一个 print(email, password) 在 auth 调用之后。 打印从 auth 返回的内容。打印(验证(用户名=电子邮件,密码=密码))

我的猜测是用户名不是电子邮件或类似的东西:)

编辑 如何调试:

  1. 以管理员用户登录在此行之前停止: 验证(用户名=电子邮件,密码=密码) 检查并打印电子邮件和密码
  2. 对 API 用户执行相同操作检查并打印电子邮件和密码 看到值是一样的。
  3. 登录 django 管理站点检查两个用户之间不同的所有权限标志组等
  4. 尝试使用 api 用户登录管理页面(设置正确的标志 is_active 等)
  5. 尝试在 django manage.py shell 或管理员用户页面为 api 用户创建新密码并重新测试

【讨论】:

  • print(authenticate(username=email, password=password)) 返回无,在此之前我检查了电子邮件和密码打印,为什么使用管理员凭据其工作和管理员创建的用户也工作。仅由 api 创建的用户存在问题
  • 请使用管理员进行操作。管理员的电子邮件是否相同?
  • 是的,管理员邮箱是一样的,但是管理员邮箱也一样?
  • "user created by api" 这个我不明白 - 请显示
  • 可能是 is_active 或 is_superuser 用户标志?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2019-06-13
相关资源
最近更新 更多