DRF auth_token:“non_field_errors”:\[“无法使用提供的凭据登录。”

新手上路,请多包涵

为 Django 编写的两个 JWT 包都给我带来了文档质量差的问题,所以我尝试了 DRF-auth_token 包。这是我遵循的一个很好的例子, Django Rest Framework Token Authentication 。理论上你应该能够去

localhost:8000/api-token-auth/

网址.py:

 from django.conf.urls import url, include
from django.contrib import admin
from django.contrib.auth.models import User
from rest_framework.authtoken import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include('api.urls', namespace='api')),
    url(r'^orders/', include('orders.urls', namespace='orders')),
    url(r'^api-token-auth/', views.obtain_auth_token, name='auth-token'),

]

为用户获取令牌不起作用,所以我自己重写了它以使其工作:

 @api_view(['POST'])
def customer_login(request):
    """
    Try to login a customer (food orderer)
    """
    data = request.data

    try:
        username = data['username']
        password = data['password']
    except:
        return Response(status=status.HTTP_400_BAD_REQUEST)

    try:
        user = User.objects.get(username=username, password=password)
    except:
        return Response(status=status.HTTP_401_UNAUTHORIZED)

    try:
        user_token = user.auth_token.key
    except:
        user_token = Token.objects.create(user=user)

    data = {'token': user_token}
    return Response(data=data, status=status.HTTP_200_OK)

我的版本有效:

 http://localhost:8000/api/login/customer-login/
{"username": "thisguy@example.com", "password": "wombat"}
-->
{
  "token": "292192b101153b7ced74dd52deb6b3df22ef2c74"
}

DRF auth_token 不起作用:

 http://localhost:8000/api-token-auth/
{"username": "thisguy@example.com", "password": "wombat"}
-->
{
  "non_field_errors": [
    "Unable to log in with provided credentials."
  ]
}

设置.py

 INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # third party:
    'django_extensions',
    'rest_framework',
    'rest_framework.authtoken',

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    )
}

它似乎设置正确。我数据库中的每个用户都有一个令牌。每个用户在数据库中都是 is_authenticatedis_active 。超级用户可以获得他们的令牌:

 localhost:8000/api-token-auth/
{"username": "mysuperuser", "password": "superuserpassword"}
-->
{
  "token": "9297ff1f44dbc6caea67bea534f6f7590d2161b0"
}

出于某种原因,只有超级用户才能获得令牌:

 localhost:8000/api-token-auth/
{"username": "regularguy", "password": "password"}
-->
{
  "non_field_errors": [
    "Unable to log in with provided credentials."
  ]
}

为什么我的用户无法登录并获取他们的令牌?谢谢

原文由 codyc4321 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 917
2 个回答

我继续从 drf token auth 文档 执行此操作,并且没有遇到超级用户、员工用户或普通用户的任何问题。

还请尝试按照官方文档的步骤而不是 SO 答案进行操作,看看是否可以解决问题 - 可能发生了一些变化。

以下是我采取的一般步骤:

  • 安装 django,drf
  • 将“rest_framework”和“rest_framework.authtoken”放入 INSTALLED_APPS
  • 在我的 rest_framework 设置中添加“TokenAuthentication”
  • 运行迁移
  • 为用户创建令牌(我刚刚在 urls.py 中做了这个)
  • 为令牌创建 url
  • POST http://localhost:8000/token/ {“用户名”: “…”, “密码”: “…”}

如果您在任何地方都公开了代码,我很乐意进一步查看并查看我的发现。

原文由 awwester 发布,翻译遵循 CC BY-SA 3.0 许可协议

  • 当我尝试使用此 API 端点时, 我收到了相同的错误消息

来自 rest_framework.authtoken.views 的“obtain_auth_token”类,

但是 惊喜!问题首先出在 用户序列化器 上! .

  • 用户 是使用 API endppint 创建的,他们的密码被保存为纯文本!,如以下屏幕截图所示: 用户数据库

但是 TokenAPI 端点加密了密码,所以从那里来了 冲突! ,

  • 我已经更改了 User Serializer 类 并重写了 创建 函数以使用对密码进行哈希处理的 set_password 函数:
   class UserSerializer(serializers.ModelSerializer):
      class Meta:
          model = User
          fields = ['email', 'username', 'password']
          extra_kwargs = {'password': {'write_only': True}}

      def create(self, validated_data):
          user = User(
              email=validated_data['email'],
              username=validated_data['username']
          )
          user.set_password(validated_data['password'])
          user.save()
          return user

  • 现在 我已经编辑了我的 User Serializer ,数据存储如下: 修改后的用户数据库

  • 所以错误: “non_field_errors”:[“无法使用提供的凭据登录。” 停止显示! ,令牌 API 端点“ localhost:8000/api-token-auth/ ”有效!

原文由 rawand deheliah 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题