NSURLCredential-credentialForTrust vs username:password

时间:2012-06-27 10:16:18

标签: objective-c nsurlconnection nsurlrequest nsurlcredential

我是iOS和https的新手。我是一名软件学生。我想编写一个应用程序,从我的uni帐户中提取数据(如班级编号,公告等)并在我的应用程序上显示。

通常情况下,我会转到我的学生页面,使用我的用户名和密码登录,并且这些信息会显示在浏览器上。

我尝试过使用NSURLConnection及其委托。请看下面的代码。一开始,在方法连接:didReceviveAuthenticationChallenge中,我通过[NSURLCredential withUser:password:persistence]创建了一个NSURLCredential对象。它没有用。然后我尝试做NSLog,然后我发现protectSpace.authenticationMethod是NSURLAuthenticationMethodServerTrust。

然后,我尝试阅读Apple的文档和一些Google搜索的来源。但是,我无法真正理解它,然后我按照下面的说明编辑了我的代码(这是我的最终版本,它仍然无效)。

我真正得到的一点是:我希望服务器能够询问我的用户名和密码。而不是那样,它要求credentialForTrust,它基于我读过的那些文件,他们建议我评估NSURLConnection委托对服务器的信任。但是,服务器从未要求输入用户名和密码。那么,服务器如何知道我正在访问哪个帐户。

所以,我认为应该是该证书(信任)与用户名和密码之间的某种关系。我真的不明白这些事情是如何运作的。

我认为,我的问题可能不是很清楚或者是某种东西,而且可能是愚蠢的。我接受这个是因为我从来没有学过所有这些东西。

所以,请有人向我解释这些事情是如何运作的。你可以假设我对什么是https,SSL,NSURLConnection,NSURLCredential等有一些基本的了解,请指导我解决。

感谢您的所有努力。

以下是我的代码,(它无效)。

连接的NSLog():didReceiveAuthenticationChallenge,打印出“NSURLAuthenticationMethodServerTrust”

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    NSLog(@"authenticationMethod is:  %@\n",challenge.protectionSpace.authenticationMethod);
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
          [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
    }else{
            NSURLCredential *creden = [[NSURLCredential alloc] initWithUser:myusername password:mypassword persistence:NSURLCredentialPersistenceForSession];
            [[challenge sender] useCredential:creden forAuthenticationChallenge:challenge];
    }
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError:  %@\n  %@\n",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
     [self.myData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [self.myData setLength:0];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
     NSString *str = [[NSString alloc] initWithData:self.myData    encoding:NSASCIIStringEncoding];
    NSLog(@"Data in String %@", str);
}

1 个答案:

答案 0 :(得分:1)

当URL加载系统不信任服务器时,会发生

NSURLAuthenticationMethodServerTrust个挑战。如果您想避免这些调用,请确保iOS信任您的服务器证书(by installing it manually,或者让Verisign信任的root用户签名)。