2013-09-25 8 views
6

Ok, questo mi sta facendo impazzire.Autenticazione AWS con Objective-C/Cacao

Sto cercando di creare un semplice client AWS S3 che consenta un'interazione di base con S3, ma sembra che stia facendo qualcosa di sbagliato e non riesco a capire di cosa si tratta. Potrebbe essere palesemente ovvio, ma non lo vedo.

mie chiavi sono corretti e sono stati testati - senza spazi finali ecc

Il problema sembra essere con la firma, si mantiene sempre la 'la firma richiesta abbiamo calcolato non corrisponde alla firma che hai fornito. Controlla il tuo codice e il metodo di firma 'errore dall'API REST di Amazon. Ho creato varie categorie che aggiungono la funzionalità di generazione base64, HMAC SHA1 e ho anche esaminato vari esempi online, ma finora non ho avuto successo.

Il motivo per cui non si utilizza la libreria fornita da Amazon è perché si rivolge a Cocoa Touch e non voglio incappare in giro per farlo funzionare su Cocoa.

È possibile prendere una copia di tutti i file/code qui: https://www.dropbox.com/s/8ts9q71dz3uopxp/S3Lite.zip

Sono comunque seguente documentazione di Amazon intorno autenticazione e per la mia mente semplice, tutto è stato fatto correttamente.

Ecco come sto generando la firma:

-(NSString *)signRequest:(NSURLRequest *)request { 
    NSMutableString *sig = [[NSMutableString alloc] init]; 

    // Request Method 
    [sig appendFormat:@"%@\n", [request HTTPMethod]]; 

    // Content MD5 
    [sig appendFormat:@"%@\n", [[request HTTPBody] MD5String]]; 

    // Content Type 
    [sig appendFormat:@"%@\n", [request valueForHTTPHeaderField:@"Content-Type"]]; 

    // Date 
    [sig appendFormat:@"%@\n", [request valueForHTTPHeaderField:@"Date"]]; 

    // Canonicalized Headers 
    [sig appendFormat:@"%@\n", @""]; // Empty for now 

    // Canonicalized Resource 
    [sig appendFormat:@"%@", [NSString stringWithFormat:@"/%@%@", _bucket, request.URL.path]]; 

    NSString *encodedString = [[[sig dataUsingEncoding:NSUTF8StringEncoding] hmacSHA1SignatureWithKey:_secretKey] base64String]; 

    return [[NSString alloc] initWithFormat:@"AWS %@:%@", _accessKey, encodedString]; 
} 

Ecco come si fa a lavorare con esso per tentare di eseguire una semplice richiesta PUT.

#import "S3Lite.h" 

S3Lite *aws = [[S3Lite alloc] initWithAccessKey:@"<access key>" 
            secretKey:@"<secret key>" 
            bucketName:@"<bucket name>" 
             region:kAmazonS3EUWest1Region 
             useSSL:NO]; 

NSData *file = [[NSData alloc] initWithContentsOfFile:@"<path to a file>"]; 

[aws putObjectWithData:file inPath:@"aRandomFile.png" withContentType:nil]; 

Qualsiasi aiuto nella giusta direzione sarebbe molto apprezzato.

S

+0

Non posso davvero aiutare perché non conosco molto il "protocollo" di S3, ma ho dato un'occhiata alla libreria java JetS3t? Potresti provare a vedere come l'hanno fatto lì. http://jets3t.s3.amazonaws.com/downloads.html –

+0

@thibaultd Ho esaminato varie altre librerie e da quello che posso vedere, la mia classe è praticamente la stessa. Non riesco a trovare il numero – SeanNieuwoudt

+0

Ho fatto alcuni test unitari basati su http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html e quando il mio codice li ha passati, tutto funzionava . –

risposta

8

Anche se non si è in grado di utilizzare l'AWS SDK per iOS direttamente, è open source, e si potrebbe ottenere alcune idee di esaminare il codice di richiesta di firma qui:

https://github.com/aws/aws-sdk-ios/blob/master/AWSCore/Authentication/AWSSignature.m

+1

Sembra la strada da percorrere, almeno utilizzando AmazonAuthUtils per le funzioni di firma –

+1

Il collegamento non funziona più, poiché Amazon ha apparentemente cambiato la struttura dell'SDK, ma l'esame dell'interno del codice sembra avere un valore, dal momento che è possibile vedere come codificano le loro corde. Il percorso operativo corrente in GitHub è aws-sdk-ios/AWSCore/Authentication/AWSSignature.m – Cindeselia

+0

aggiornato. Grazie per il testa a testa. –

1

È necessario assicurarsi di includere valori vuoti in quella stringa quando manca l'intestazione corrispondente dalla richiesta (ad esempio Content-MD5 è facoltativo per le richieste PUT e senza significato per le richieste GET - è necessario includere solo il suo valore nella stringa che si sta firmando se la tua richiesta include quella intestazione in la chiamata API a S3).

+0

Sono abbastanza sicuro che l'ordine sia corretto? Linea 80 - 96 di S3Lite.m – SeanNieuwoudt

+0

Siamo spiacenti, il mio male, si sta utilizzando l'ordine corretto. Aggiornerò la mia risposta Controlla comunque la seconda parte perché è possibile che questa sia la causa per cui ottieni una firma diversa da quella generata da S3. – dcro

1

Attualmente sto sviluppando un S3 Client Framework basato su AFNetworking 1.0 (a causa della compatibilità con i sistemi operativi precedenti). Lo stesso framework è ancora in fase di sviluppo, ma tutti i metodi di firma delle richieste per AWS4-HMAC-SHA256 sono già implementati e funzionanti. Puoi trovare il framework su github: https://github.com/StudioIstanbul/SIAFAWSClient

Sentiti libero di puntarlo e di implementare le tue funzioni in modo che possiamo lavorarci insieme. Attualmente vengono implementate tutte le richieste S3 di base.

Naturalmente si può anche solo copiare il mio - (NSString *) AuthorizationHeaderStringForRequest: (NSMutableURLRequest *) funzione di richiesta per il proprio codice. La documentazione di AWS su questo non è molto buona al momento in quanto manca alcuni passaggi nella creazione delle chiavi di firma.