问题 Django REST Framework:将TokenAuthentication与可浏览的API一起使用


我正在关注DRF文档来设置TokenAuthentication,并且无法使用可浏览的API。我相信我添加了正确的线条 settings.py

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    ),

INSTALLED_APPS = (
   ...
'rest_framework',
'rest_framework.authtoken',
   ...

以及使用文档中的代码段为现有用户生成令牌。如果我查询,我可以看到每个用户的令牌 authtoken_token 表,所以我知道他们存在。

每次我尝试登录可浏览的API时,都会返回以下内容:

HTTP 401 Unauthorized
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
WWW-Authenticate: Token

{
"detail": "Authentication credentials were not provided."
}

所以它似乎是尝试令牌认证,但这个消息有点奇怪。当我输入错误的密码时,我会在登录表单上收到“输入正确的密码”消息。当我输入正确的密码时,它似乎登录,但带我到上面的消息的API根,并在顶部菜单上显示“登录”,而不是用户名。

这可能与我的自定义用户模型有关吗?或者可能是因为我正在使用dev服务器进行开发,该服务器不支持https- DRF文档提到需要使用HTTPS进行TokenAuthentication,尽管我不确定这是最佳做法还是实际需要。


2573
2018-02-24 11:38


起源



答案:


你不能使用可浏览的api TokenAuthentication。你必须添加 SessionAuthtication 到你的设置(http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication):

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.SessionAuthentication',
),

12
2018-02-24 11:49



我猜那个答案 - 谢谢你! - dkhaupt
如果我添加此身份验证,并不意味着向我的服务器发出请求的任何人都只能使用用户名和密码访问(如果没有令牌身份验证),是吗?它只适用于我猜的网站,但我想确定。 - Kutay Demireren
甚至'rest_framework.authentication.BasicAuthentication'也可以达到目的。我更喜欢它,因为理想情况下,SessionAuthentication只应在服务器和客户端都运行在django模板之类的相同上下文中时使用。 @KutayDemireren - 是的任何拥有用户名/密码和适当权限的人都可以访问API。但它是否可以发布API端点。 - Jadav Bheda


答案:


你不能使用可浏览的api TokenAuthentication。你必须添加 SessionAuthtication 到你的设置(http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication):

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.SessionAuthentication',
),

12
2018-02-24 11:49



我猜那个答案 - 谢谢你! - dkhaupt
如果我添加此身份验证,并不意味着向我的服务器发出请求的任何人都只能使用用户名和密码访问(如果没有令牌身份验证),是吗?它只适用于我猜的网站,但我想确定。 - Kutay Demireren
甚至'rest_framework.authentication.BasicAuthentication'也可以达到目的。我更喜欢它,因为理想情况下,SessionAuthentication只应在服务器和客户端都运行在django模板之类的相同上下文中时使用。 @KutayDemireren - 是的任何拥有用户名/密码和适当权限的人都可以访问API。但它是否可以发布API端点。 - Jadav Bheda