【问题标题】:Django REST Framework: using TokenAuthentication with browsable APIDjango REST 框架:使用带有可浏览 API 的 TokenAuthentication
【发布时间】:2016-06-06 16:22:51
【问题描述】:

我正在按照 DRF 文档设置 TokenAuthentication,但无法使其与可浏览 API 一起使用。我相信我在settings.py 中添加了正确的行:

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

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

以及使用文档中的代码 sn-p 为现有用户生成的令牌。如果我查询 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 根目录,并在顶部菜单上显示“登录”,而不是用户名。

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您不能将可浏览 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',
    ),
    

    【讨论】:

    • 如果我添加此身份验证,这并不意味着向我的服务器发出请求的任何人都将仅使用用户名和密码访问(就像没有令牌身份验证一样),是吗?我猜它只适用于网站,但我想确定一下。
    • 即使是“rest_framework.authentication.BasicAuthentication”也可以达到目的。我更喜欢它,因为理想情况下 SessionAuthentication 应该只在您的服务器和客户端都在相同的上下文(如 django 模板)中运行时使用。 @KutayDemireren - 是的,任何拥有用户名/密码和适当权限的人都可以访问 API。但是否发布 API 端点取决于您。
    • 对于其他可能会感到困惑的新手。基本上我的理解是会话身份验证允许您通过您的用户名和密码实际登录到可浏览的 API 并查看文档。我相信令牌身份验证可以保护您的 API 端点,并且会话身份验证允许您通过可浏览的 API 访问它们。我不确定公开会话身份验证是否会削弱安全性。我会把它留给其他人。
    • 为我工作。在会话上方指定令牌,您可以在手机应用程序和可浏览的api上登录。
    • 在此为以后阅读这些 cmets 的人澄清一下,浏览器只是一个 HTTP 客户端,就像其他任何客户端一样。以这种方式添加 SessionAuthetication 允许对所有客户端进行这种类型的身份验证,而不仅仅是可浏览的 API。
    【解决方案2】:

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

    设置表头示例:

    我写了一篇关于如何做到这一点的博文:link to post

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

    【讨论】:

    • 这是最佳响应,因为它不需要您更改身份验证方案即可使用可浏览 API。很高兴使用它。
    【解决方案3】:

    我做到了:

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

    我在 api.py 中添加了一个自定义身份验证类

    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

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 2015-11-25
      • 2021-09-26
      • 2020-10-24
      • 2016-04-04
      相关资源
      最近更新 更多