2013-09-25 2 views
6

좋아,이 말은 나를 괴롭힌다.Objective-C/Cocoa를 사용한 AWS 인증

S3와의 기본적인 상호 작용을 허용하는 간단한 AWS S3 클라이언트를 만들려고 시도하고 있지만 잘못된 것으로 보이고 실제로 무엇인지 파악할 수없는 것 같습니다. 그것은 분명히 명백 할 수도 있지만, 나는 그것을 보지 않을 것이다.

내 키는 정확하고 테스트되지 않았다 - 아니 우리가 제공 한 서명과 일치하지 않습니다 계산 된 '요청 서명을 받고 계속,

문제가 서명 될 것으로 보인다 공백 등 후행. Amazon의 REST API에서 키와 서명 방법 '오류를 확인하십시오. Base64, HMAC SHA1 세대 기능을 추가하는 다양한 카테고리를 만들었으며 다양한 온라인 예제를 살펴 보았지만 아직까지는 성공하지 못했습니다.

아마존에서 제공하는 라이브러리를 사용하지 않는 이유는 코코아 터치를 목표로하고 있기 때문에 코코아에서 작동하도록 해킹하고 싶지 않기 때문입니다.

당신은 여기에 모든 파일/코드의 복사본을 잡아 수 있습니다 https://www.dropbox.com/s/8ts9q71dz3uopxp/S3Lite.zip

내가 그러나 인증 주위에 내 간단한 마음에 아마존의 설명서 다음하고는, 모든 것이 제대로 수행되고있다. 여기

내가 서명을 생성하고있어 방법은 다음과 같습니다

-(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]; 
} 

다음은 간단한 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]; 

올바른 방향으로 도움을 주시면 감사하겠습니다. 당신 iOS 용 AWS SDK를 사용할 수없는 경우에도

S

+0

S3의 "프로토콜"에 대해 많이 알지 못해서 정말 도움이되지 않지만 Java 라이브러리 JetS3t를 살펴 보았습니까? 그들이 어떻게했는지 보려고 할 수 있습니다. http://jets3t.s3.amazonaws.com/downloads.html –

+0

@thibaultd 다양한 다른 라이브러리를 보았습니다. 볼 수있는 것에서도 수업은 거의 같습니다. 그냥 문제를 찾지 못하는 것 같습니다. – SeanNieuwoudt

+0

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html을 기반으로 한 단위 테스트를 만들었고 코드가 통과 할 때까지 모든 것이 작동하고있었습니다. . –

답변

8

직접, 그것은 오픈 소스이며, 여기에 요청 서명 코드를 검사에서 몇 가지 아이디어를 얻을 수 있습니다 :

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

+1

적어도 서명 기능을 위해 AmazonAuthUtils를 사용하는 것 같습니다. –

+1

Amazon이 분명히 SDK 구조를 변경했기 때문에 링크가 더 이상 작동하지 않지만 코드 구조 내부를 검사하는 것이 장점이있는 것 같습니다. 어떻게 그들의 문자열을 인코딩합니다. GitHub의 현재 작동 경로는 aws-sdk-ios/AWSCore/Authentication/AWSSignature.m – Cindeselia

+0

입니다. 헤즈 업에 감사드립니다. –

1

해당 헤더가 요청에서 누락 된 경우 해당 문자열에 빈 값을 포함해야합니다 (예 : Content-MD5은 PUT 요청의 경우 선택 사항이며 GET 요청의 경우 의미가 없습니다. 해당 값을 문자열에 포함시켜야합니다. 요청에 해당 헤더가 포함 된 경우 서명 S3에 대한 API 호출).

+0

주문이 정확한지 확신합니다. 라인 80 - 96 of S3Lite.m – SeanNieuwoudt

+0

죄송합니다, 저의 경우 올바른 주문을 사용하고 있습니다. 내 대답을 업데이트 할게. 어쨌든 가능한 한 두 번째 부분을 확인해 보면 S3가 생성하는 서명과 다른 서명을 얻는 이유가 될 수 있습니다. – dcro

1

현재 AFNetworking 1.0을 기반으로하는 S3 클라이언트 프레임 워크를 개발 중입니다 (구형 운영 체제와의 호환성으로 인해). 프레임 워크 자체는 아직 개발 중이지만 AWS4-HMAC-SHA256에 대한 모든 요청 서명 방법은 이미 구현되어 작동 중입니다. 프레임 워크는 github에서 찾을 수 있습니다. https://github.com/StudioIstanbul/SIAFAWSClient

자유롭게 프레임을 포크하고 함께 구현할 수 있도록 함수를 구현하십시오. 현재 모든 기본 S3 요청이 구현됩니다. 자신의 코드에 (NSMutableURLRequest *) 요청 기능 : (있는 NSString *) AuthorizationHeaderStringForRequest - 물론

당신은 내 을 복사 할 수 있습니다. AWS 문서는 서명 키를 만드는 몇 가지 단계가 없어 현재로서는별로 좋지 않습니다.