Tengo una clase Cocoa configurada que quiero usar para conectarme a un servicio web RESTful que estoy creando. He decidido utilizar la autenticación básica HTTP en mi backend PHP así ...¿Puedo usar NSURLCredentialStorage para autenticación básica HTTP?
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
//Stuff that users will see if they click 'Cancel'
exit;
}
else {
//Validation Code
echo "You entered info.";
}
?>
En este momento estoy usando un NSURLConnection sincrónica, que entiendo que los estados de documentación de Apple tiene menos soporte para la autenticación.
Pero, ¿es posible? Puedo hacer autenticación de cookies muy fácilmente sin NSURLProtectionSpaces o NSURLCredentials o cualquiera de las clases de autenticación. Además, ¿hay algún recurso donde pueda leer más sobre las clases de Autenticación Cocoa?
Gracias.
ACTUALIZACIÓN: mikeabdullahuk El código que ha proporcionado (el segundo ejemplo) es casi idéntico al que había escrito. He hecho un poco más de investigación, y descubrió que el NSURLConnection devuelve un error ...
Error Domain=NSURLErrorDomain Code=-1012 UserInfo=0x1a5170 "Operation could not be completed. (NSURLErrorDomain error -1012.)"
El código corresponde a NSURLErrorUserCancelledAuthentication. Aparentemente, mi código no está accediendo a NSURLCredentialStorage y en su lugar está cancelando la autenticación. ¿Podría esto tener algo que ver con las funciones de Autenticación HTTP de PHP? Estoy bastante confundido en este punto.
acabo se encontró con esto. Soy muy nuevo en ObjectiveC, pero me preguntaba si hubo que liberar algún objeto (específicamente credencial y protectionSpace). Por cierto, implementé este método en una llamada asincrónica (initWithRequest) y todavía obtuve la devolución de llamada didReceiveAuthenticationChallenge. – Bill
@Bill, protectionSpace necesita ser liberado si se usa en el código de producción como utilicé + alloc. –
protectionSpace tiene que ser lanzado. alloc devolverá un objeto con retainCount == 1 entonces después de [... setDefaultCredential: ...] deberías lanzarlo como [release de protectionSpace]; – sliver