2015-09-12 20 views
6

Tôi đang cố gắng tải hình ảnh từ ứng dụng iPhone lên S3 bằng url được ký trước. AWS đã kết thúc mà không có câu trả lời.tải lên hình ảnh bằng cách sử dụng url được ký trước đến s3 alway trả về lỗi 403

Bước 1: iPhone gửi một yêu cầu đến máy chủ để GET link S3 để tải lên một hình ảnh

{ 
    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"; 
} 

Bước 2: Sử dụng giá trị "signed_request" Tôi cố gắng để tải lên một hình ảnh để S3 sử dụng phương pháp "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]; 

// Phản hồi từ máy chủ

{ 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; 
} } 

// DỮ LIỆU tôi nhận

<?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

Tôi vừa sao chép mã của bạn và mã hoạt động ở cuối. hãy kiểm tra xem URL của bạn có hoạt động không. – ChaubeyJi

Trả lời

2

Tôi không thể tìm thấy lỗi trong mã của bạn; tuy nhiên, khi trạng thái phản hồi, giá trị mong muốn của bạn là SignatureDoesNotMatch. Không có mật khẩu bí mật, không có quyền truy cập vào câu lạc bộ bí mật. Bắt đầu với những điều cơ bản và sau đó thu hẹp ở trên các chi tiết:

  • Xác minh bạn đang sử dụng cặp bên phải của phím cho ID, chữ ký, vv
  • Xác minh rằng tập hợp các phím dành cho những tài khoản AWS/S3 bên phải (không đi qua làn đường từ Dev đến Prod, v.v.)
  • Xác minh tài khoản AWS được kết nối với các khóa đó có quyền truy cập vùng chứa S3 mà bạn đang nhắm mục tiêu
  • Xác minh tài khoản AWS ở đúng khu vực và yêu cầu đó là đi đến khu vực đó
  • Đảm bảo bạn đang nhắm mục tiêu latest S3 API
  • Hãy thử sao chép theo yêu cầu từ một nền tảng client (trình duyệt, giao diện điều khiển, công cụ REST) ​​để xem nếu lỗi là nền tảng cụ thể
  • Check the algorithm bạn đang sử dụng để tạo ra chữ ký để đảm bảo nó hoạt động chính xác
  • Hãy tìm kiếm common coding mistakes trong việc lắp ráp yêu cầu của bạn để đảm bảo yêu cầu của bạn được tạo đúng (ví dụ: Mã hóa URL/khoảng trắng, các ký tự XML dành riêng)
  • Theo dõi AWS Troubleshooting Guide
  • Nếu không tìm thấy lỗi, không loại trừ it could be a bug on Amazon's side và xem xét gửi báo cáo lỗi hoặc mở trường hợp hỗ trợ.
+0

Đánh giá cao nhận xét của bạn cho url được ký trước, chúng tôi không cần phải mật khẩu bí mật vì nó sẽ được mã hóa trong url. Chúng ta phải tải lên hình ảnh. Nếu tôi sử dụng cùng một URL trong postman nó đã được hoàn hảo. – Anand

+0

Âm thanh như một lỗi nền tảng cho tôi sau đó. Còn một câu hỏi "ngu xuẩn" nữa, bạn đã kiểm tra xem hình ảnh 'dữ liệu' có thực sự được điền và được chuyển với lời gọi phương thức và từ đó với yêu cầu HTTP không? Và điều đó làm ngửi yêu cầu với [Fiddler] (http://www.telerik.com/fiddler) (hoặc tương đương) tìm thấy mọi thứ được gửi qua dây khớp với yêu cầu kiểm tra của bạn? – brichins

Các vấn đề liên quan