iPhone 上的基本 HTTP 身份验证
-
13-09-2019 - |
题
我正在尝试运行一个小型 Twitter 客户端,但在测试需要身份验证的 API 调用时遇到了问题。
我的密码中有特殊字符,因此当我尝试使用以下代码时它不起作用。
NSString *post = [NSString stringWithFormat:@"status=%@", [status stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@@%@/statuses/update.json", username, password, TwitterHostname]];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSURLResponse *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
我开始研究 base64 并将身份验证放入标头中。我发现 戴夫·德里宾的 发布了他的 base64 实现,这似乎是有道理的。然而,当我尝试使用它时,编译器开始抱怨它如何找不到 openssl 库。所以我读到我需要链接 libcrypto 库,但它似乎不存在于 iphone 中。
我还读到有人说苹果不允许应用程序使用加密库,这对我来说没有意义。
所以现在我有点困惑和困惑。在我的应用程序中进行基本身份验证的最简单方法是什么?
干杯
解决方案
两件事情。首先必须使用异步方法,而不是同步/类方法。
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:req]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:30.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
在认证是由在委派实现该方法进行管理:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
和你可能还需要过实现这些方法:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
使用异步方法趋于反正给出更好的用户体验,所以尽管额外的复杂性是不值得做认证的能力,就算做。
其他提示
您也可以直接在主 URL 中写入下载用户名和密码,即 https://用户名:密码@yoururl.com/
首先,您需要调用 NSURLConnection 委托文件:-
(BOOL)连接:(NSURLConnection *)连接 canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
返回是;}
然后致电 - (void)连接:(nsurlconnection *)连接didReceiveAthenticationChallenge :( nsurlauthenticationchallenge *)挑战
{
if ([challenge previousFailureCount] == 0)
{
NSURLCredential *newCredential;
newCredential = [NSURLCredential credentialWithUser:@"username"
password:@"password"
persistence:NSURLCredentialPersistenceForSession];
NSLog(@"NEwCred:- %@ %@", newCredential, newCredential);
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
else
{
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog (@"failed authentication");
}
}
不隶属于 StackOverflow