我正在尝试使用来自 iPhone 应用程序的 NSURLRequest 对 HTTP RESTful 站点进行身份验证。我将 user/pass 编码为 base64,并将其作为 NSURLRequest 中的“Authorization” header 传入,并附加了“Basic”一词。但是,我在另一端不断收到身份验证错误。这是我的代码。如果我执行手动 CURL 请求,它会起作用。我还检查以确保 Base64 编码正确并且用户、密码和 url 正确。
NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
NSString *basicAuthCredentials = [NSString stringWithFormat:@"%@:%@", user, pass];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", AFBase64EncodedStringFromString(basicAuthCredentials)];
authValue = [authValue stringByReplacingOccurrencesOfString:@"\n" withString:@""];
[urlRequest setValue:authValue forHTTPHeaderField:@"Authorization"];
[urlRequest setHTTPMethod: @"GET"];
NSData *httpData = [self encodeDictionary:data];
[urlRequest setHTTPBody:httpData];
NSHTTPURLResponse *response;
NSError *error;
NSData* result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
最佳答案
授权代码看起来不错。当然,stringByReplacingOccurrencesOfString
是不必要的,但不会造成伤害。我可能会使用原生的base64方法(NSData
方法base64EncodedDataWithOptions
或base64EncodedStringWithOptions
在iOS 7中,base64Encoding
在iOS 7之前的版本中)而不是AFNetworking的,但我认为这也不是问题。
假设您的用户名和密码正确,并且您的服务器确实正在使用基本身份验证(如果您的 cURL 成功,我认为这是正确的),这里唯一明显不正确的是对 setHTTPBody
的调用对于 GET
要求。 NSURLConnection
不会发送 GET
的正文请求(也不应该,因为正文在 GET
请求中在语义上没有意义)。如果你想发送带有body的请求,一般应该使用 POST
.或者如果您想在 GET
中发送参数请求时,您可以将它们添加到 URL,但不能添加到正文。
关于ios - 带有 HTTP 身份验证的 NSURLRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623407/