具有社交身份验证和请求发布的 Django Rest 框架(CSRF-Security)
Posted
技术标签:
【中文标题】具有社交身份验证和请求发布的 Django Rest 框架(CSRF-Security)【英文标题】:Django Rest Framework with Social Auth And Request Post (CSRF-Security) 【发布时间】:2015-10-31 08:15:46 【问题描述】:我需要 Django Rest 和 Social Auth 方面的帮助......我有一个视图和下一个结构......
class ObtainAuthTokenFacebook(APIView):
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
serializer_class = AuthTokenSerializer
def post(self, request, backend):
serializer = self.serializer_class(data=request.DATA)
user = register_by_access_token(request, backend)
这是我登录的功能......
from django.contrib.auth import login
@psa('social:complete')
def register_by_access_token(request, backend, *args, **kwargs):
access_token = request.data.get('token')
user = request.backend.do_auth(access_token)
if user:
login(request, user)
return user
else:
return 'ERROR'
当在我看来发送响应时......我的前端收到这个......
HTTP/1.0 200 OK
Date: Fri, 07 Aug 2015 18:53:31 GMT
Server: WSGIServer/0.1 Python/2.7.9
Vary: Cookie
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
Allow: POST, OPTIONS
Set-Cookie: csrftoken=PZHraHwhFsog2eT6n5psckJBfFEPmPQR; expires=Fri, 05-Aug-2016 18:53:31 GMT; Max-Age=31449600; Path=/
Set-Cookie: sessionid=nhxbh9slhw3pw887necskqfohczkzxo3; expires=Fri, 21-Aug-2015 18:53:31 GMT; httponly; Max-Age=1209600; Path=/
但是....我现在使用 ios 和 ios 保存第一个请求的 cookie...,当我发送相同的请求时,cookie 粘贴在我的标头中...。服务器响应一个403 ....这是因为代码具有这样的结构,我的请求发送csrftoken和一个sessionid ..
当请求到达服务器时,这会拒绝这个请求...
我如何在后端管理 csrf 令牌......以避免拒绝未来的请求......
【问题讨论】:
【参考方案1】:django-restframework 使用 django 内置的 CSRF 保护机制,并没有实现自己的。您可能想为您的 api 端点禁用 CSRF,以便任何客户端都可以 POST/PUT/PATCH 到它们。您可以通过两种方式做到这一点:
a) 通过从中间件列表中删除 django.middleware.csrf.CsrfViewMiddleware
在系统范围内
b) 选择性地,用csrf_exempt
装饰您的端点。要在类范围内装饰 CBV 方法,您需要在 dispatch
方法上使用 method_decorator
装饰器。
这样,您的 API 的客户端无需担心 csrf 令牌。
无论您从上面选择做什么,我建议您首先阅读 django 中有关 CSRF 的文档,以便了解在应用程序的任何部分禁用此保护的含义:https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/
如果这适合您的应用程序需求,那么您就可以开始了 :)
【讨论】:
但是...如果我实现 csrf 的这种机制.....因为,,, 每次我用一个 csrf 发送我的请求...请求被拒绝?...那我的一部分不清楚..... 有关如何在 django 中实现 CSRF 的详细信息可以在这里找到:git.io/vOhCT 但据我所知,在您的 iOS 应用程序中,您试图重用在其他地方生成的 csrf 令牌(可能在您的borwser?),它不适用于生成它的客户端以外的客户端 当我向服务器发送第一个请求时确实生成了这个 csrf.. 然后.. 这个 csrf 保存在设备中......然后.. 当我向这个服务器发送其他请求时..这个令牌进入标题...在这一刻我不知道,因为如果我在 miy 后端实现这种 csrf 机制,请求被拒绝...感谢您的帮助.... 我的后端生成令牌,但稍后拒绝。以上是关于具有社交身份验证和请求发布的 Django Rest 框架(CSRF-Security)的主要内容,如果未能解决你的问题,请参考以下文章
django-rest-auth vs djoser,哪一个用于社交身份验证?
Django中的Python社交身份验证,makemigrations检测到没有变化
具有社交媒体身份验证的用户的 Firebase 重置密码问题
用于 Spotify 的 Python 社交身份验证:重定向缺少“状态”参数