85 votes

NSURLConnection et l’authentification de base HTTP dans iOS

J'ai besoin d'invoquer un premier GET HTTP request Base Authentication. Ce serait la première fois que la demande est envoyée au serveur et j'ai déjà l' username & password donc il n'y a pas besoin d'un défi lancé par le serveur d'autorisation.

Première question:

  1. N' NSURLConnection être défini comme synchrone à faire de l'Authentification Basique? En fonction de la réponse sur ce post, il semble que vous ne pouvez pas faire l'Authentification Basique, si vous optez pour l'itinéraire asynchrone.

  2. Quelqu'un sait de toute un exemple de code qui illustre l'Authentification Basique sur un GET request sans la nécessité d'une réponse défi? La documentation d'Apple montre un exemple, mais seulement une fois que le serveur a émis la demande de récusation pour le client.

Je suis une sorte de nouveau la mise en réseau partie du SDK, et je ne suis pas sûr de les autres classes que je devrais utiliser pour obtenir ce travail. (Je vois l' NSURLCredential classe, mais il semble qu'il est utilisé uniquement avec NSURLAuthenticationChallenge après que le client a demandé une autorisée des ressources du serveur).

132voto

catsby Points 6133

J’utilise une connexion asynchrone avec MGTwitterEngine et il définit l’autorisation de la ( ) comme suit :

Je ne crois pas cette méthode nécessite de passer par la boucle de défi, mais je peux me tromper

80voto

dom Points 6811

Réponse à même la question, je veux vous présenter la solution, qui ne nécessite pas des libs externes, j’ai trouvé dans un autre thread :

7voto

Luke Points 1077

Si vous ne souhaitez pas importer l'ensemble de MGTwitterEngine et vous ne faites pas une demande asynchrone Ensuite, vous pouvez utiliser http://www.chrisumbel.com/article/basic_authentication_iphone_cocoa_touch

Base64 encode le nom d'utilisateur et mot de passe Pour le remplacer

NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodingWithLineLength:80]];

avec

NSString *encodedLoginData = [Base64 encode:[loginString dataUsingEncoding:NSUTF8StringEncoding]];

après

vous aurez besoin d'inclure le fichier suivant

static char *alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

@implementation Base64
+(NSString *)encode:(NSData *)plainText {
    int encodedLength = (((([plainText length] % 3) + [plainText length]) / 3) * 4) + 1;
    unsigned char *outputBuffer = malloc(encodedLength);
    unsigned char *inputBuffer = (unsigned char *)[plainText bytes];

    NSInteger i;
    NSInteger j = 0;
    int remain;

    for(i = 0; i < [plainText length]; i += 3) {
        remain = [plainText length] - i;

        outputBuffer[j++] = alphabet[(inputBuffer[i] & 0xFC) >> 2];
        outputBuffer[j++] = alphabet[((inputBuffer[i] & 0x03) << 4) | 
                                     ((remain > 1) ? ((inputBuffer[i + 1] & 0xF0) >> 4): 0)];

        if(remain > 1)
            outputBuffer[j++] = alphabet[((inputBuffer[i + 1] & 0x0F) << 2)
                                         | ((remain > 2) ? ((inputBuffer[i + 2] & 0xC0) >> 6) : 0)];
        else 
            outputBuffer[j++] = '=';

        if(remain > 2)
            outputBuffer[j++] = alphabet[inputBuffer[i + 2] & 0x3F];
        else
            outputBuffer[j++] = '=';            
    }

    outputBuffer[j] = 0;

    NSString *result = [NSString stringWithCString:outputBuffer length:strlen(outputBuffer)];
    free(outputBuffer);

    return result;
}
@end

1voto

John M. P. Knox Points 583

Si vous utilisez GTMHTTPFetcher pour votre connexion, l’authentification de base est assez facile aussi bien. Il suffit de fournir les informations d’identification de l’outil de récupération avant de commencer l’extraction.

0voto

Gaius Parx Points 395

Pouvez-vous me dire quelle est la raison derrière la limitation de la ligne de codage de longueur de 80 dans votre exemple de code? Je pensais que les en-têtes HTTP ont une longueur max de quelque chose comme la 4k (ou peut-être que certains serveurs ne prenez pas quelque chose de plus que cela). – Justin Galzic Déc 29 '09 à 17:29

Il n'est pas limité à 80, c'est un choix de la méthode base64EncodingWithLineLength dans NSData+Base64.h/m, où vous pouvez partager votre chaîne codée sur plusieurs lignes, ce qui est utile pour les autres applications, telles que nntp de transmission. Je crois que 80 est choisi par le twitter du moteur de l'auteur à être d'une longueur suffisante pour accueillir la plupart des utilisateur/mot de passe codé suite à une ligne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X