首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要有关NSURLCredential initWithTrust的帮助:

需要有关NSURLCredential initWithTrust的帮助:
EN

Stack Overflow用户
提问于 2011-07-04 16:37:48
回答 1查看 928关注 0票数 1

在过去的几个小时里,我一直在碰壁,但在任何地方都找不到一丝解决方案。我正在开发一个学习如何使用JSON的应用程序,所以我只是在构建一个简单的应用程序,一开始只是返回我在GitHub上的所有repos的列表。我能够毫无问题地从NSURLConnection返回的数据中提取JSON响应,不幸的是,当我试图访问任何需要身份验证的东西时,响应总是{ message = "Not Found"; }如果我发送一个请求来获取关于我的用户名的公开信息,我会得到包含所有正确信息的正确响应,因此我知道我正在成功地与api.github.com通信。首先开始我使用的请求:

代码语言:javascript
复制
    -(IBAction)retriveRepos:(id)sender
{
    responseData = [[NSMutableData data] retain];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://api.github.com/user/repos"]];
    [request setHTTPMethod:@"GET"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

当调用- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge时,身份验证方法返回为NSURLAuthenticationMethodServerTrust (我觉得很奇怪,因为我觉得我应该提供用户名和密码才能登录)。根据苹果的文档,我需要用initWithTrust:创建我的NSURLCredential。我在谷歌上搜索答案,最后找到了几个地方,上面说只需要从传入的NSURLAuthenticationChallengeprotectionSpace中获取serverTrust即可。这样做根本没有任何效果的迹象,事实上,我的NSURLCredential看起来几乎什么都没有。

代码语言:javascript
复制
if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
        NSLog(@"challenge.protectionSpace.serverTrust: %@", challenge.protectionSpace.serverTrust); // This logs "challenge.protectionSpace.serverTrust: <SecTrust 0x10340b2e0 [0x7fff7cc12ea0]>"
        NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:challenge.protectionSpace.serverTrust];
        NSLog(@"credential: %@", credential); // Always logs something like "credential: <NSURLCredential: 0x1002d2f20>: (null)"
        NSURLCredential *otherCredential = [[NSURLCredential alloc] initWithUser:@"user" password:@"password" persistence:NSURLCredentialPersistencePermanent];
        NSLog(@"otherCredential: %@", otherCredential); // This logs otherCredential: <NSURLCredential: 0x1018d0840>: user"
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    }

我还使用了更广泛的日志记录,这表明credential确实存在(起初我认为它根本没有被创建),但是它没有设置certificates: (null) hasPassword: 0 identity: (null) password: (null)的任何属性。我只能假设问题出在我的身份验证上,但我严格遵循了我找到的示例。我使用的是Lion的GM预览版,所以我猜可能是我发现了一个错误,或者GitHub应用程序接口中有一些错误,但考虑到我的技能水平,我发现我更有可能是一个坐在我面前看答案的笨蛋。如果有人知道一个好的指南,可以指导你完成身份验证的所有步骤(最好是所有样式的),而不是严重缺乏的Apple URL加载指南,它只说使用一种方法,但没有说明SecTrustRef来自哪里,将非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-25 16:14:30

NSURLAuthenticationMethodServerTrust是您将在协商SSL连接时返回的内容。它让您有机会评估服务器的信任(反之亦然)。Technote 2232对此进行了详细的描述。您的代表需要处理它,technote链接到示例代码Advanced URL Connections的源代码,它应该向您展示如何应对该挑战。

不要灰心,如果有来自你的服务器的HTTP身份验证步骤,你会看到委派稍后会得到它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6569110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档