用于iOS的REST调用的身份验证问题

时间:2014-06-24 17:16:29

标签: ios objective-c rest django-rest-framework

我目前正在尝试从iOS设备进行REST调用。我的代码在

之下
 NSString *restCallString = [NSString stringWithFormat:@"MyURL"];
NSURL *url = [NSURL URLWithString:restCallString];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
[request setHTTPMethod:@"GET"];
[request addValue:Value1 forHTTPHeaderField:@"Header1"];
[request addValue:Value2 forHTTPHeaderField:@"Header2"];
[request setURL:[NSURL URLWithString:restCallString]];

@try{
      _currentConnection = [[NSURLConnection alloc]   initWithRequest:request delegate:self];
}
@catch(NSError *e){
    NSLog(@"%@", e.description);
}

每当调用此方法时,都会收到以下错误:未提供身份验证凭据。但是,令我困惑的是,如果我通过HTTP Web控制台发送相同的GET请求,它就能完美运行。换句话说,使用相同的URL和相同的2个头 - 值对,我在Web控制台上获得有效响应,并且看不到身份验证错误。可能导致这种情况的原因是什么?

2 个答案:

答案 0 :(得分:1)

您正在设置HTTP标头。这不起作用,因为HTTP标头不包含在$_GET$_POST中,因为它们不是内容,而是对预期内容的描述。

请改为尝试:

NSURL *url = [NSURL URLWithString:[restCallString stringByAppendingFormat:@"?Header1=%@&Header2=%@", Value1, Value2]];

因为您必须知道该网址符合RFC 1738

答案 1 :(得分:1)

  

如果我通过HTTP Web控制台发送相同的GET请求,它可以正常运行

我怀疑您的网络控制台正在利用SessionAuthentication - 即如果您已经在浏览器中登录了自己的网站,那么API会根据您的会话Cookie对您进行身份验证。

Django Rest Framework提供了各种身份验证方法,也有第三方选项。最简单的方法可能是提供的Token Auth方法。

确保已启用此功能。在管理员(或通过提供的视图)中创建令牌,并确保您已设置Authorization标头。它需要看起来像这样:

Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

所以你的Objective-C会像:

  [request addValue:[NSString stringWithFormat:@"Token %@", yourToken]
 forHTTPHeaderField:@"Authorization"];

希望这能让你开始。