2015-09-12 7 views
6

Sto tentando di caricare un'immagine dall'app per iPhone su S3 utilizzando l'URL pre-firmato. AWS è finito senza risposta.caricamento dell'immagine utilizzando l'url predefinito per s3 restituisce sempre l'errore 403

Fase 1: iPhone Invia una richiesta alle server per ottenere link in S3 per caricare un'immagine

{ 
    randomKey = "EJg="; 
    "signed_request" = "https://as-profile.s3.amazonaws.com/EJg%3Dios_1442061863.jpg?AWSAccessKeyId=AKIXXXXXSWPIXXXXXNXQ&Expires=1442062152&Signature=L%2BMq%2FLMXXXXXXXXzmvyGXXXXXzU%3D"; 
    url = "https://as-profile.s3.amazonaws.com/EJg%3Dios_1442061863.jpg"; 
} 

Fase 2: Utilizzo di "signed_request" Valore Sto cercando di caricare un'immagine per S3 utilizzando il metodo "PUT"

NSURL *url = [NSURL URLWithString:dict[@"signed_request"]]; 
// adding signed_request 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPBody:imgData]; 
[request setValue:@"public-read" forHTTPHeaderField:@"x-amz-acl"]; 
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPMethod:@"PUT"]; 

NSURLSessionDataTask *task1 = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

       NSError *err; 

       NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
       // 
       NSLog(@"data = %@", dataString); 

}]; 
[task1 resume]; 

// risposta dal server

{ status code: 403, headers { URL: https://as-profile.s3.amazonaws.com/EJg%3Dios_1442061863.jpg?AWSAccessKeyId=AKIXXXXXSWPIXXXXXNXQ&Expires=1442062152&Signature=L%2BMq%2FLMXXXXXXXXzmvyGXXXXXzU%3D } { status code: 403, headers { 
    Connection = close; 
    "Content-Type" = "application/xml"; 
    Date = "Sat, 12 Sep 2015 12:44:30 GMT"; 
    Server = AmazonS3; 
    "Transfer-Encoding" = Identity; 
    "x-amz-id-2" = "mmKNUnKaR5bA4AY/odP2iLY4JAdPkFX7kqdCEteU+Lju2py7BC909ME+Z7+QQMM0Tq64UWtlgCQ="; 
    "x-amz-request-id" = 3AE1557722FFB82F; 
} } 

// DATI ricevo

<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIXXXXXSWPIXXXXXNXQ</AWSAccessKeyId><StringToSign>PUT 

image/jpeg 
1442062152 
x-amz-acl:public-read 
/as-profile/EJg%3Dios_1442061863.jpg</StringToSign><SignatureProvided>L+Mq/LM2LWlBA8TzmvyGt19AJzU=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 6a 70 65 67 0a 31 34 34 32 30 36 32 31 35 32 0a 78 2d 61 6d 7a 2d 61 63 6c 3a 70 75 62 6c 69 63 2d 72 65 61 64 0a 2f 61 73 2d 70 72 6f 66 69 6c 65 2f 45 4a 67 25 33 44 69 6f 73 5f 31 34 34 32 30 36 31 38 36 33 2e 6a 70 67</StringToSignBytes><RequestId>3AE1557722FFB82F</RequestId><HostId>mmKNUnKaR5bA4AY/odP2iLY4JAdPkFX7kqdCEteU+Lju2py7BC909ME+Z7+QQMM0Tq64UWtlgCQ=</HostId></Error> 
+0

Ho appena copiato il codice e il suo funzionamento alla mia estremità. per favore controlla se il tuo URL funziona. – ChaubeyJi

risposta

2

Impossibile trovare un errore nel codice; tuttavia, come indica la risposta, il tuo SignatureDoesNotMatch valore atteso. Nessuna password segreta, nessun accesso al club segreto. Inizia con le basi e quindi restringere sui dettagli:

  • Verificare che si sta utilizzando il giusto paio di chiavi per ID, firma, ecc
  • Verificare che set di chiavi è per l'account AWS/S3 destra (non attraversando corsie da Dev a Prod, ecc.)
  • Verificare che l'account AWS connesso a tali chiavi disponga dei diritti per accedere al contenitore S3 che si sta utilizzando come target
  • Verificare che l'account AWS si trovi nella regione corretta e che la richiesta sia andare in quella regione
  • Assicurati di avere come target il latest S3 API
  • Prova duplicare la richiesta da un'altra piattaforma client (browser, console, strumento REST) ​​per vedere se l'errore è specifico per la piattaforma
  • Check the algorithm si sta utilizzando per generare la firma per garantire il corretto funzionamento
  • Cerca common coding mistakes nell'assemblare la tua richiesta per assicurarti che la tua richiesta sia ben strutturata (es. URL/codifica spazi, caratteri XML riservati)
  • Seguire la AWS Troubleshooting Guide
  • Se non vengono rilevati errori, non escludo che it could be a bug on Amazon's side e prendere in considerazione la presentazione di una segnalazione di bug o l'apertura di un caso di supporto.
+0

Apprezzo i tuoi commenti per l'URL pre-firmato, non abbiamo bisogno di passare la password segreta in quanto verrà crittografata nell'URL. Dobbiamo solo caricare l'immagine. Se uso lo stesso URL in postino era prefetto. – Anand

+0

Allora mi sembra un bug della piattaforma. Ancora una domanda "stupida", hai controllato che l'immagine 'data' sia effettivamente popolata e passata con la chiamata al metodo e quindi con la richiesta HTTP? E che annusare la richiesta con [Fiddler] (http://www.telerik.com/fiddler) (o equivalente) trova che tutto ciò che viene inviato tramite il filo corrisponde alla richiesta di test? – brichins

Problemi correlati