Основная HTTP-аутентификация на iPhone
Я пытаюсь запустить небольшой клиент 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 и помещал аутентификацию в заголовки. Я нашел сообщение Dave Dribin's о своей реализации base64, и это, казалось, имело смысл. Однако, когда я попытался использовать его, компилятор начал жаловаться на то, как он не смог найти библиотеки openssl. Поэтому я прочитал, что мне нужно связать библиотеку libcrypto, но, похоже, для iphone она не существует.
Я также читал людей, говорящих, что яблоко не позволит приложениям, использующим криптографические библиотеки, для меня это не имеет смысла.
Итак, теперь я немного застрял и смутился. Какой самый простой способ получить базовую аутентификацию в моем приложении?
Приветствия
Ответы
Ответ 1
Две вещи. Во-первых, вы должны использовать методы async, а не метод synchronous/class.
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;
Использование метода async имеет тенденцию давать лучший пользовательский опыт в любом случае, поэтому, несмотря на то, что дополнительная сложность стоит делать даже без возможности аутентификации.
Ответ 2
Вы можете напрямую написать письмо с именем пользователя и паролем в главном URL-адресе i.e https://username:[email protected]/
Прежде всего вам нужно вызвать файл делегата NSURLConnection: -
а затем вызовите
- (void) соединение: (NSURLConnection *) соединение didReceiveAuthenticationChallenge: (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");
}
}