Frequentemente temos que fazer alguma requisição em servidores HTTP e mais frequentemente ainda estes servidores pedirem autenticação por senha. Um exemplo comum é tentar acessar uma pasta protegida em um webserver onde é pedido um usuario e senha antes de permitir o acesso.
Quando usamos o objeto NSURLRequest para fazer esta requisição, o delegate do NSURLConnection possui metodos que nos avisam quando o servidor está pedindo uma autenticação por usuario e senha.
Este post irá demonstrar um exemplo de request a URL que possui autenticação.
Inicia o request a URL:
/*---------------------------------------------------------------------------
* Começa o processo de autenticação
*--------------------------------------------------------------------------*/
- (void)startAuthentication
{
NSURL *url = [NSURL URLWithString:@"http://protectedURL.com"];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
// Inicia o request
// Assume que NSURLConnection *urlConnection está definida como uma variável de instancia
urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
}
Responde a requisição de autenticação:
Se uma requisição de autenticação for pedida pela URL o metodo abaixo será chamado. Para responder basta criar um objeto NSURLCredential setando usuario e senha.
Note que nós podemos checar quantas vezes a requisição falhou e disparar uma mensagem de erro.
/*---------------------------------------------------------------------------
* Recebeu a requisição de autenticação
*--------------------------------------------------------------------------*/
- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
// Acesso falhou 2 vezes...
if ([challenge previousFailureCount] > 1)
{
[urlConnection release];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Erro de autenticação"
message:"Excesso de tentativas sem sucesso!"
delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];
}
else
{
// Responde a requisição
NSURLCredential *cred = [[[NSURLCredential alloc] initWithUser:@"admin" password:@"password"
persistence:NSURLCredentialPersistenceForSession] autorelease];
[[challenge sender] useCredential:cred forAuthenticationChallenge:challenge];
}
}
/*---------------------------------------------------------------------------
* Termina de carregar a URL
*--------------------------------------------------------------------------*/
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Conexão de sucesso!");
[urlConnection release];
}
/*---------------------------------------------------------------------------
* Falha na conexão da URL
*--------------------------------------------------------------------------*/
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"Falha na conexão.");
[urlConnection release];
}

