【问题标题】:Django rest-framework does not store authenticated user between callsDjango rest-framework 不会在调用之间存储经过身份验证的用户
【发布时间】:2013-04-22 00:07:05
【问题描述】:

对于我目前正在进行的项目,我决定编写一个自定义身份验证模型。我正在使用其余框架和所有访问权限。本地身份验证尚未实现(已实现,但版本不同,因此没有问题)。

用户模型正确注册并且 OAuth 身份验证有效。用户登录正常。

使用视图时,如果我使用 django 的视图作为基类,则身份验证可以正常工作。如果我使用 rest-framework 的 APIView 就没有那么多了。

在我的 ProfileView 中(LOGIN_REDIRECT_URL 在此处重定向)我收到了一个 rest_framework.request.Request 实例,这对我来说是可以的。问题是:

request.user 是 AnonymousUser 的一个实例(即使在登录后)

我猜问题出在我的实现上,但是:

request._request.user 是经过身份验证的用户

(注意request._request是原始的django请求)

我倾向于认为这是一个 rest-framework 错误,但也许你们中的某个人知道解决方法?

编辑 请注意,登录是在非 APIView 类中进行的,而是在从 View 继承的类中进行的。这可能是 User 实例未传递给 APIView 实例的原因。

【问题讨论】:

  • 提供一些代码,你做了什么?
  • 好吧,在这种情况下,我认为没有必要这样做,因为它确实有效!在我的 get_or_create_user() 方法中,我有这个: return User.objects.create_user(**kwargs) 它确实返回了一个 User 实例(kwargs 是一个包含所有字段的标准字典)。问题不在于身份验证,问题在于其余框架似乎正在创建自己的 AnonymousUser 实例,而不是使用 django 本机提供的实例。

标签: python django django-rest-framework


【解决方案1】:

您需要在settings.py 中设置DEFAULT_AUTHENTICATION_CLASSES。否则 DRF 将默认为 Nonerequest.authAnonymousUserrequest.user

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

一旦您设置好并且用户已登录,请确保 session_id 在请求标头中可用。浏览器通常存储会话信息并将其传递到所有请求的标头中。

如果您使用的是非浏览器客户端(例如移动应用程序),则需要在标头中手动设置会话 ID。

此外,由于您提到您使用oauth 登录用户,对于oauth2,您需要指定oauth2 授权标头而不是会话ID。

"Authorization: Bearer <your-access-token>" 

参考Django Rest Framework中的认证

【讨论】:

  • 我没有使用 rest-framework 的身份验证模型。我已经定义了自己的后端和用户模型。那我应该放什么?
  • 顺便说一句,我正在使用会话身份验证。
  • 您需要通过继承 Baseauthentication 来实现您的自定义身份验证,并在 settings.py 中提供该方法。例如django-rest-framework.org/api-guide/…
猜你喜欢
  • 2013-05-03
  • 2019-02-20
  • 1970-01-01
  • 2019-07-26
  • 2019-07-06
  • 2014-06-07
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多