对于我目前正在进行的项目,我决定编写一个自定义身份验证模型。我正在使用rest-framework和all-access。本地身份验证尚未实现(它是,但在不同的版本中,所以没有问题)。
用户模型正确注册并且OAuth身份验证有效。用户记录正常。
使用视图时,如果我使用django的View作为基类,则身份验证可以正常工作。如果我使用rest-framework的APIView,那就不那么多了。
在我的ProfileView(这里重定向LOGIN_REDIRECT_URL)中,我收到了一个rest_framework.request.Request实例,我可以这样做。问题是:
request.user是AnonymousUser的一个实例(即使在登录后)
我猜这个问题在于我的实现,但随后:
request._request.user是经过身份验证的用户
(请注意,request._request是原始的django请求)
我倾向于认为这是一个休息框架错误,但也许你们其中一个人知道一个解决方法?
修改 请注意,登录是在非APIView类中进行的,而是在从View继承的类中进行的。这可能是User实例未传递给APIView实例的原因。
答案 0 :(得分:2)
您需要在DEFAULT_AUTHENTICATION_CLASSES
中设置settings.py
。其他DRF默认为None
为request.auth
,AnonymousUser
为request.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>"
中的身份验证