Django REST 的 JSON Web 令牌不会向用户数据库进行身份验证
Posted
技术标签:
【中文标题】Django REST 的 JSON Web 令牌不会向用户数据库进行身份验证【英文标题】:JSON Web Token for Django REST won't authenticate to user database 【发布时间】:2016-02-01 19:20:41 【问题描述】:我有一个工作的 Django REST API 后端。我以前使用会话身份验证,但想转向基于令牌以跨多个服务器进行扩展。我已经研究了几天了,但我还没有找到我的问题的答案。我将 djangorestframework-jwt 包添加到我的应用程序中,但是当我尝试进行身份验证时总是返回:
"non_field_errors":["Unable to login with provided credentials."]
我在 jwt 包中看到了这个错误,并且可以通过身份验证过程跟踪代码。我在身份验证过程中看不到任何错误。当我尝试使用这些凭据创建用户时,它说用户已经存在,所以我知道它正在访问正确的用户表。我不确定为什么 get_jwt_token 端点不会验证我的凭据。以下是我的 django 应用程序的相关部分。任何帮助将不胜感激。如果我遗漏了任何可以帮助解决此问题的内容,请告诉我,我会上传。谢谢,
app/settings.py
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100,
app/urls.py
urlpatterns = patterns('',
# Api
url(r'^api/', include(router.urls)),
url(r'^api/stats', statsviews.StatsView.as_view()),
url(r'^api/testing', statsviews.TestView.as_view()),
url(r'^api/login', 'rest_framework_jwt.views.obtain_jwt_token'),
url(r'^api/logout', logout, 'next_page': '/api/login'),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
)
卷曲命令
curl -d "email=test@myemail.com&password=test123" http://webhost.mywebsite.com:8080/api/login/
【问题讨论】:
您是否已将 rest_framework_jwt 添加到您的 INSTALLED_APPS 列表中? 文档中没有任何内容表明需要将其添加到 INSTALLED_APPS。我只是说将其添加到 DEFAULT_AUTHENTICATION_CLASS 将 rest_framework_jwt 添加到您安装的应用程序中。无论出于何种原因,他们都将其排除在文档之外。 @joed4no django-rest-jwt 默认使用用户名登录,你好像用的是邮箱 我遇到了同样的问题,这与我的自定义用户模型存储密码的方式有关。您可以使用通过manage.py
创建的超级用户登录吗?如果是这样,请查看他们的密码如何存储在 admin 与您的自定义用户的密码中。如果您的自定义用户密码未经过哈希处理,请尝试将密码从您的超级用户复制到第二个用户。现在尝试使用您的超级用户密码获取自定义用户的令牌。
【参考方案1】:
我的设置与您非常相似。一个简单的应用程序,利用 vanilla DRF JWT 身份验证。我能说的唯一区别是我的 INSTALLED_APPS 列表中包含了 rest_framework_jwt:
INSTALLED_APPS = (
...
# Third Party Dependencies
'rest_framework',
'rest_framework_jwt',
'corsheaders',
....
尝试添加它,看看它会带给你什么。
【讨论】:
它没有把我带到任何地方【参考方案2】:我也遇到了同样的问题,终于找到了出路。
按照快速入门指南 (http://www.django-rest-framework.org/tutorial/quickstart/) ,使用python manage.py migrate
创建表结构;使用python manage.py createsuperuser
创建初始用户admin,密码为“password123”; (注意:指南中的密码不匹配)
现在应该没问题了。
$ curl -X POST -d "username=admin&password=password123" http://127.0.0.1:8000/api-token-auth/
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwidXNlcl9pZCI6MiwiZW1haWwiOiJhZG1pbkA3amdvLmNvbSIsImV4cCI6MTQ3MDY0NjY4Mn0.Dg4KW5pHHJfuaRzjqHTu8kYIzkq8js9
【讨论】:
这行得通,但为什么它不适用于使用 API 创建的用户?密码的存储方式相同。以上是关于Django REST 的 JSON Web 令牌不会向用户数据库进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
django rest框架json web token注销功能
我可以通过 django-rest-auth 登录和注册返回 JSON Web Token (JWT) 吗?