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

dkh*_*upt 15 django django-rest-framework

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

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

INSTALLED_APPS = (
   ...
'rest_framework',
'rest_framework.authtoken',
   ...
Run Code Online (Sandbox Code Playgroud)

以及使用文档中的代码段为现有用户生成令牌.如果我查询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."
}
Run Code Online (Sandbox Code Playgroud)

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

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

ils*_*005 19

你不能使用可浏览的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',
),
Run Code Online (Sandbox Code Playgroud)


ppl*_*ski 5

您可以使用浏览器插件在标头中设置令牌。我正在使用免费的Modheader

设置标题的示例:

在 modheader 中设置标题

我写了一篇关于如何做到这一点的博客文章:链接到帖子

我喜欢这个解决方案,因为您不需要更改身份验证类。