将NSURLCredentialStorage与同步NSURLConnection一起使用

时间:2010-08-02 21:35:37

标签: iphone objective-c cocoa authentication

我遇到的问题与此问题非常相似:Can I use NSURLCredentialStorage for HTTP Basic Authentication?

该问题的作者接受了答案,但后来发布了解决方案代码返回NSURLErrorUserCancelledAuthentication错误。我正在使用DIGEST身份验证,但是否则我的代码执行相同的操作,并返回相同的错误。

我不想以明文形式发送用户名和密码,所以我绝对不想简单地将用户名和密码添加到URL的前面。有没有办法让NSURLConnection的sendSynchronousRequest:returningResponse:error:方法咨询共享的NSURLCredentialStorage?这听起来像是一个类别的东西,但我对如何做到这一点并不是最微弱的想法 - 听起来我必须完全重新实现sendSynchronousRequest:returningResponse:error:方法来获得它工作。

如何执行咨询共享NSURLCredentialStorage的同步URL连接?

2 个答案:

答案 0 :(得分:3)

绝对可以。创建NSURLCredential,并将NSURLCredentialStorage添加为保护空间的默认。 例如:

// Permananent, session, whatever.
NSURLCredential *credential = [NSURLCredential credentialWithUser:username password:password persistence: NSURLCredentialPersistencePermanent];
// Make sure that if the server you are accessing presents a realm, you set it here.
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:@"blah.com" port:0 protocol:@"http" realm:nil authenticationMethod:NSURLAuthenticationMethodHTTPBasic];
// Store it
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace];

此时,使用与您设置的保护空间匹配的任何后续NSURLConnection将使用此凭证

答案 1 :(得分:0)

这可能无法完全回答您的问题,但是:通过NSURLConnection进行同步提取存在许多问题(身份验证最少),如果可能的话,您应该重新构建应用以使用异步API相反,这很可能不会出现您在身份验证方面遇到的问题。