适用于与ios应用程序配合使用的api的django csrf

时间:2013-05-04 06:30:50

标签: ios django ios5 csrf

我正在构建一个与服务器通信以获取数据的ios应用程序。

如果它只是一个普通的应用程序,我可以通过表单发送csrf令牌(因为所有来自同一个域)。但是,对于ios应用程序,我不认为我可以设置csrf令牌。

因此,当从ios应用程序向服务器发出请求时,我收到有关csrf的错误。那么,最新解决方案是什么?禁用此csrf功能或其他更好的方法?这是我的第一个ios应用程序,所以请告诉我一个更好的方法,所以我会遵循它。

1 个答案:

答案 0 :(得分:12)

对于您的iOS应用访问的那些网址(“API端点”),您需要在相应的视图功能上指定@csrf_exempt以禁用csrf保护。

此处有更多详情 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

并通过其他身份验证方法保护这些网址,例如会话身份验证。

为了您的身份验证,您可以轻松参考django rest framework和django tastypie所做的事情。两者都使用SessionAuthentication类来处理身份验证并保护您的iOS应用程序可以连接的公开URL(API端点)。

<强>参考文献: -

Django tastypie也有一个授权类,不要与身份验证混淆。它还有一个APIKey授权类,当你想要将你的django URL暴露给其他第三方开发人员时,它们可能想要构建他们自己的应用程序来与你的django URL通信以访问数据(想想“facebook APIs”) 。每个第三方开发人员实质上都可以提供一个唯一的API,因为您拥有APIKeyAuthorization类和为每个第三方应用程序提供的唯一API密钥,您可以确保只有“授权”的应用程序才能使用您的django URL。这就是各种大型平台如“Google+”或“Facebook”等的工作原理。

django的csrf如何工作的详细信息

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

  

CSRF保护基于以下内容:

     

设置为随机值的CSRF cookie(与会话无关   nonce,因为它被称为),其他网站将无法访问。

     

此cookie由CsrfViewMiddleware设置。这是永久的,   但由于没有办法设置一个永不过期的cookie,它就是   发送每个已拨打的回复   django.middleware.csrf.get_token()(内部使用的函数)   检索CSRF令牌。

     

隐藏的表单字段,名称为“csrfmiddlewaretoken”   传出的POST表单。该字段的值是CSRF的值   cookie中。

     

这部分由模板标签完成。

     

对于所有未使用HTTP GET,HEAD,OPTIONS的传入请求   或TRACE,必须存在CSRF cookie,并且'csrfmiddlewaretoken'   字段必须存在且正确。如果不是,用户将得到一个   403错误。

     

此检查由CsrfViewMiddleware完成。

     

此外,对于HTTPS请求,严格的引用检查由   CsrfViewMiddleware。这对于解决中间人问题是必要的   使用独立会话时在HTTPS下可能发生的攻击   nonce,因为HTTP'Set-Cookie'标题是   (不幸的是)被正在与网站交谈的客户接受   HTTPS。 (没有为HTTP请求进行引用检查,因为   在HTTP下,Referer头的存在不够可靠。)

     

这确保了只有源自您网站的表单   可用于POST数据。