2013-05-04 30 views
9

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

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

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

回答

10

对于iOS应用正在访问的URL(“API端点”),您需要在相应的视图函数中指定@csrf_exempt来禁用csrf保护。

更多细节在这里 -https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

和保护通过其他身份验证方法,如会话验证这些URL。

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

参考: -

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

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

的CSRF保护是基于以下几点

详情:

被设置为随机值

一个CSRF的cookie(会话独立的 现时,因为它被称为),其他网站将无法访问。

这个cookie由CsrfViewMiddleware设置。这意味着永久性的, 但由于没有办法设置永不过期的cookie,所以在 django.middleware.csrf.get_token()( 内部使用的函数检索CSRF令牌)。

名为“csrfmiddlewaretoken”存在于所有 传出POST形式隐藏的表单字段。此字段的值是CSRF cookie的值。

这部分是由模板标签完成的。

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

该检查由CsrfViewMiddleware完成。

此外,HTTPS请求,严格引荐检查由 CsrfViewMiddleware完成。由于HTTP'Set-Cookie'标头为 (不幸地)被客户端接受,因此在使用与会话无关的 随机数时,这对于解决在HTTPS下可能发生的中间人攻击 是必要的。与网址为 的HTTPS进行通话。 (Referer的检查不为HTTP请求完成,因为 存在的Referer标头是不是在HTTP下足够可靠。)

这确保只有源自你的网站 形式可以用于发布数据备份。

+0

感谢。 ...... ... +1 – user2349115 2013-05-04 06:47:27

相关问题