Django REST框架:将TokenAuthentication与可浏览的API

时间:2016-02-24 11:38:02

标签: 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',
   ...

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

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

这可能会以某种方式与我的自定义用户模型相关吗?或者可能是因为我目前正在使用开发服务器进行开发,而开发服务器并不支持https- DRF文档提到需要使用HTTPS验证令牌,尽管我不确定这是否是最佳实践或实际需要。

3 个答案:

答案 0 :(得分:17)

您无法在TokenAuthentication使用可浏览的API。您必须将SessionAuthtication添加到您的设置(http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication):

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

答案 1 :(得分:1)

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

设置标题的示例:

set header in modheader

我写了一篇有关如何完成此操作的博客文章:link to post

我喜欢这种解决方案,因为您不需要更改auth类。

答案 2 :(得分:0)

我做到了:

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

我在api.py中添加了一个自定义auth类

class CustomAuthToken(ObtainAuthToken):

    authentication_classes = [TokenAuthentication]

    def post(self, request, *args, **kwargs):
        ...
        return Response({...})

请参见https://www.django-rest-framework.org/api-guide/authentication/#by-exposing-an-api-endpoint