2013-01-12 102 views
8

因此,我试图将表单数据发布到我的同事的网站,以便从我的iPhone应用程序登录(简单的用户名和密码)。但是,似乎我需要一个CSRF令牌才能发布。我已经做了大量的研究,并从我可以从csrftoken cookie(我在这里阅读:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/)中使用GET请求获得该令牌。问题是,我不知道这个GET请求究竟做了什么?我从哪里得到?如何在iOS中获取CSRF令牌?

这是迄今为止我POST请求的代码:

NSURL *url = [NSURL URLWithString:SERVER_ADDRESS]; 
NSData* postData= //Some form data 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

[request addValue:token forHTTPHeaderField:@"X-CSRFToken"]; //Where do I get this token from 

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request 
                   delegate:self]; 
[connection start]; 

我知道有很多类似的帖子这个StackOverflow上的,但我没有用,这似乎完全回答中发现的任何。通常它只是引导我到上面的链接,其中只填充了AJAX相关信息。帮助将非常感谢!

+1

csrf标记位于cookie中,默认情况下'csrftoken'将在同一会话中的相同视图中接收。在发布信息以获取此Cookie之前,您需要做另一个请求。 – SingleNegationElimination

+1

您是否找到解决此问题的解决方案? –

+1

您好友网站上的任何表单都应在表单中包含令牌。您可以从网站上的任何表单解析html。否则,请他在仅显示csrf标记的网站上创建一个页面。 – gcdev

回答

0

正如在评论中指出的,你可以从任何包含你朋友网站上的表单的页面解析它。

如果你想要一个自己问他在/ios/

ios.html渲染这个模板:

{% csrftoken %} 

然后启动一个GET request:2 您可以用解析标记的值正则表达式:

NSString *regex = @"csrfmiddlewaretoken\".*?\"\(.*?\)\""; 

最后,你必须设置X-CSRFToken的值在你的下一个翼HTTP HTTP请求。

+0

抓饼干呢? –

0

为了用令牌登录(POST),当然你必须首先获得CSRF令牌,就像你说的。如果您首先对登录页面执行GET调用(然后再执行POST),则登录页面的结果将返回一个csrf_token,您可以看到是否使用浏览器(通过打开的开发人员工具窗格),然后查看在响应内容的网络窗格中查看由服务器设置的csrftoken cookie。在我的情况:在登录/密码信息的POST

X-CSRFToken: "PgQEgY3LAynbVeWRIzXoo2VFRLfd8Uqt" 

Set-Cookie:csrftoken=PgQEgY3LAynbVeWRIzXoo2VFRLfd8Uqt; expires=Fri, 10-Nov-2017 18:59:54 GMT; Max-Age=31449600; Path=/; secure 

解析了这一点的响应后,设置像头。 HTH