如何在iOS中获取CSRF令牌?

时间:2013-01-12 21:19:43

标签: iphone ios django

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

以下是我的帖子请求到目前为止的代码:

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相关信息。非常感谢帮助!

2 个答案:

答案 0 :(得分:0)

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

如果您想要自己的一个,请他在/ios/

呈现此模板

ios.html:

{% csrftoken %}

然后发布GET request: 2 您可以使用正则表达式解析令牌的值:

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

最后,您必须在以下HTTP POST请求中设置X-CSRFToken的值。

答案 1 :(得分:0)

为了使用令牌登录(POST),当然你必须首先获得CSRF令牌,就像你说的那样。如果你首先对登录页面进行GET调用(在你跟进POST之前),登录页面的结果将返回一个csrf_token,你可以看到,如果你使用浏览器(使用开放的开发人员工具窗格),看看在响应内容下的网络窗格中,查看服务器设置的csrftoken cookie。就我而言:

X-CSRFToken: "PgQEgY3LAynbVeWRIzXoo2VFRLfd8Uqt" 

解析出响应后,设置如下标题:

#If VBA7 Then
Private Declare PtrSafe Function apiGetComputerName Lib "kernel32" Alias _
"GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#Else
Private Declare Function apiGetComputerName Lib "kernel32" Alias _
"GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
#End If
在您的POST中使用登录名/密码信息

。 HTH