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
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 –
@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
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 . –