Django Rest Framework 无效的用户名/密码

Adm*_*les 9 python api django django-rest-framework

尝试执行简单的“ GET ”,并返回管理员凭据

"detail": "无效的用户名/密码。"

我有一个自定义用户模型,我在其中删除了username,而是使用facebook_id

USERNAME_FIELD = 'facebook_id'
Run Code Online (Sandbox Code Playgroud)

我尝试更改DEFAULT_PERMISSION_CLASSES

('rest_framework.permissions.IsAuthenticated',), -- doesn't work!
('rest_framework.permissions.IsAdminUser',), -- doesn't work!
Run Code Online (Sandbox Code Playgroud)

唯一有效的是:

('rest_framework.permissions.AllowAny',),
Run Code Online (Sandbox Code Playgroud)

但我不希望那样,因为我正在为移动应用程序构建 API

我还声明了一个CustomUserAdmin模型和CustomUserCreationForm,显然这不是问题


帮助我了解需要做什么来解决这个烦人的问题,我猜这可能与权限/身份验证或我 CustomUserModel..

另外,让我知道是否有更好的方法让移动应用程序客户端对 api 进行身份验证

小智 7

刚刚有同样的问题。就我而言,问题的根源是 Apache 的基本身份验证,我的浏览器正在发送Authorization标头,而 Django REST Framework 认为该标头将由它处理。解决方案非常简单:只需 'rest_framework.authentication.BasicAuthentication'从您的

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [ 
        # ... auth classes here ... 
    ]
}
Run Code Online (Sandbox Code Playgroud)

或者明确设置默认值DEFAULT_AUTHENTICATION_CLASSESBasicAuthDRF 的 defaults 中删除。

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework.authentication.SessionAuthentication",
    ),
}
Run Code Online (Sandbox Code Playgroud)


Ros*_*ers 0

您有默认值,然后您有每个视图。您可以将默认值设置为IsAuthenticated,然后覆盖视图的特定permission_classes. 例如

class ObtainJSONWebLogin(APIView):
    permission_classes = ()
Run Code Online (Sandbox Code Playgroud)

或者

class Foo(viewsets.ModelViewSet):
    permission_classes = ()
Run Code Online (Sandbox Code Playgroud)