如何在使用NSURLSession时传递凭据

时间:2013-11-05 08:46:27

标签: ios objective-c nsurlsession

我正在尝试使用utorrent webui登录我自己的计算机。

目前我正在使用以下代码:

- (void)login
{
NSURL *feedsURL = [NSURL URLWithString:@"http://localhost:12345/"];

NSString *user = @"username";
NSString *password = @"password";
NSURLCredential *defaultCredential = [NSURLCredential credentialWithUser:user password:password persistence:NSURLCredentialPersistencePermanent];

NSString *host = [feedsURL host];
NSInteger port = [[feedsURL port] integerValue];
NSString *protocol = [feedsURL scheme];
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:host port:port protocol:protocol realm:nil authenticationMethod:NSURLAuthenticationMethodHTTPBasic];

NSURLCredentialStorage *credentials = [NSURLCredentialStorage sharedCredentialStorage];
[credentials setDefaultCredential:defaultCredential forProtectionSpace:protectionSpace];

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
[config setURLCredentialStorage:credentials];

NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil];
[[session dataTaskWithURL:feedsURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    if (!error) {
        NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
        if (httpResp.statusCode == 200) {
            NSLog(@"Woo! everything is working");
        } else {
            NSLog(@"Hrmmm... error %@ occured", error);
        }
    } else {
        NSLog(@"Hrmmm... error %@ occured", error);
    }

}] resume];

我可以在使用桌面Web浏览器时看到该页面,但是,在我的应用程序中,它总是返回401错误(不是授权)。

我想这是因为凭据没有被使用?如果是这样,使用它的正确方法是什么?还没有调用NSURLSessionDelegate方法。我还有别的办法吗?

2 个答案:

答案 0 :(得分:1)

HTTP Basic通常需要一个保护空间领域;这可能是它失败的地方。使用curl -v检查从服务器返回的身份验证质询标头,找出它是什么。

除此之外,您列出的代码应该正常工作 - 我刚刚实现了非常类似的东西,并且正确传递了凭据。我也遇到过没有调用委托身份验证质询方法的问题。

答案 1 :(得分:0)

尝试使用端口

替换localhost和计算机IP地址