Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone:如何使用NSURLCredential获得HTTPS Web服务的基本身份验证_Iphone_Cocoa Touch_Nsurlconnection_Nsurlcredential - Fatal编程技术网

iPhone:如何使用NSURLCredential获得HTTPS Web服务的基本身份验证

iPhone:如何使用NSURLCredential获得HTTPS Web服务的基本身份验证,iphone,cocoa-touch,nsurlconnection,nsurlcredential,Iphone,Cocoa Touch,Nsurlconnection,Nsurlcredential,我正在尝试使用基本身份验证调用https web服务(RESTful)。 如果我将凭据放在url本身中,它可以正常工作,但我更愿意将其添加到请求中,以便密码不会出现,例如在异常中 我正在使用以下代码: NSURLCredential *credential = [NSURLCredential credentialWithUser:@"myuser" password

我正在尝试使用基本身份验证调用https web服务(RESTful)。 如果我将凭据放在url本身中,它可以正常工作,但我更愿意将其添加到请求中,以便密码不会出现,例如在异常中

我正在使用以下代码:

    NSURLCredential *credential = [NSURLCredential credentialWithUser:@"myuser"
                                                             password:@"mypassword"
                                                          persistence:NSURLCredentialPersistenceForSession];

    NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                             initWithHost:@"example.com"
                                             port:443
                                             protocol:@"https"
                                             realm:nil
                                             authenticationMethod:NSURLAuthenticationMethodHTTPBasic];


    [[NSURLCredentialStorage sharedCredentialStorage]  setDefaultCredential:credential
                                                        forProtectionSpace:protectionSpace];

    NSURLConnection *theConnection = [NSURLConnection  connectionWithRequest:theRequest delegate:self];
但它不起作用。调用了
didReceiveAuthenticationChallenge
delegate方法,我可以在那里添加凭证,但理想情况下,我会随请求一起发送凭证


有什么想法吗?

如果是基本身份验证,请尝试在标题中发送凭据。每次都对我有用

用于在请求标头中发送用户名和密码

NSString *authString = [[NSString stringWithFormat:@"%@:%@", userName, password] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *finalAuth = base64 of authString;

在您的请求中,添加一个带有字段名Authorization和值
“Basic”+finalAuth

的标题。我错过了使用NSURLConnection的最后一行代码。确保您的代表正在响应:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
对于您的保护空间,返回“是”

此外,请确保您的代表正在响应:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

在这里,您可以将您创建的凭据分配给proposedCredential属性中的
NSURLAuthenticationChallenge
,以及
NSURLProtectionSpace
实例分配给
NSURLAuthenticationChallenge

的protectionSpace属性,当它重新获得质询时工作正常,但我尽量避免在最初的要求下发送证件,我不认为这是往返。无论哪种方式,连接都将受到挑战,并且必须提供凭据。我以前尝试过这种方法,但无法使其正常工作。我再试一试。这会给你一个错误吗?你确定错误是因为身份验证挑战失败吗?这对我来说很有效,奇怪的是苹果的文档中没有提到这一点。此外,我还不得不使用我自己的Base64编码,这很糟糕。authString的
Base64部分是什么?