Django REST Framework 解决 CSRF Failed: CSRF token missing or incorrect.
出现原因当您使用SessionAuthentication 时,您正在使用 Django 的身份验证,这通常需要检查 CSRF。Django REST Framework 强制执行此操作,仅适用于SessionAuthentication,因此您必须在X-CSRFToken标头中传递 CSRF 令牌。出现场景在对外提供一些开放性 api 时,对方是不需要携带 csrf_token 的,但是在我们框
出现原因
当您使用SessionAuthentication 时,您正在使用 Django 的身份验证,这通常需要检查 CSRF。Django REST Framework 强制执行此操作,仅适用于SessionAuthentication,因此您必须在X-CSRFToken标头中传递 CSRF 令牌。
出现场景
在对外提供一些开放性 api 时,对方是不需要携带 csrf_token 的,但是在我们框架中是使用了 SessionAuthentication 方式对用户进行认证的,自己使用时我们会遵守认证方式的规范进行传递有效的 csrf_token,对外开放时就要屏蔽这种认证方式,解决办法:
from rest_framework.authentication import SessionAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return # To not perform the csrf check previously happening
代码解析:
编写一个类继承自 SessionAuthentication, 重写 enforce_csrf 方法,
如果返回一个 None,则代表不执行之前发生的 csrf 检查。
视图中使用:
class Object(APIView):
authentication_classes = (CsrfExemptSessionAuthentication, )
def post(self, request, format=None):
pass
关于 csrf_exempt
关于其他网址所说的设置 csrf_exempt,那都是后面的操作,用户请求网站,首先要做的就是关于用户验证,只有认证通过了,后续的操作才可以使用 csrf_exempt 来对视图进行 csrf 的豁免。
登录豁免
from django.views.decorators.csrf import csrf_exempt
from rest_framework import permissions
class XViewSet(ModelViewSet):
permission_classes = [permissions.AllowAny]
@classmethod
def as_view(cls, actions=None, **kwargs):
view = super(UserViewSet, cls).as_view(actions=actions, **kwargs)
return csrf_exempt(login_exempt(view))
参考文献
摘自:https://stackoverflow.com/questions/26639169/csrf-failed-csrf-token-missing-or-incorrect
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)