Django Rest框架与社交认证和请求帖子(CSRF-安全)

时间:2015-08-07 19:29:42

标签: python django rest django-csrf

我需要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。 enter image description here

当请求到达服务器时,拒绝此请求......

我如何管理后端的csrf令牌......以避免拒绝未来的请求.....

1 个答案:

答案 0 :(得分:0)

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/

如果这适合您的应用需求,那么您可以去:)