Minio с iOS AWS S3 SDK SignatureDoesNotMatch

У меня есть приложение для iOS, которое загружает / выгружает на / из Amazon S3. Я бы хотел заменить Amazon S3 своим собственным облаком Minio.

Я выполнил краткое руководство здесь https://github.com/minio/minio, и у меня работает Minio на моем локальном хосте, и я могу размещать файлы с помощью s3cmd (https://docs.minio.io/docs/s3cmd-with-minio).

К сожалению, мне не удается заставить его работать из моего приложения для iOS.

Я использую AWS SDK v2.4.16, поэтому я могу изменить конечную точку и сделал ее своим локальным хостом (http://my-imac.local:9000), и я обновил свой ключ доступа и секретный ключ, но получаю сообщение об ошибке SignatureDoesNotMatch: «Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи». .

Указывая на мой локальный сервер:

AWSEndpoint *minioEndpoint = [[AWSEndpoint alloc] initWithURLString:@"http://my-imac.local:9000"];
AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:region 
        endpoint:minioEndpoint 
        credentialsProvider:credentialProvider];
[AWSS3 registerS3WithConfiguration:configuration forKey:s3RegionString];

Вот что я получаю на своем локальном хосте:

time = "2017-04-10T23: 36: 21Z" level = error msg = "{\" method \ ": \" PUT \ ", \" path \ ": \" / mybucket / 28AB7D6DCFC44102955EBC0AEFF6E4E2-20170407161228839-0700 / foo_28AB7D6BCEFC044A210 -20170407161228839-0700_v2.json_bin \ ", \" query \ ": \" \ ", \" header \ ": {\" Accept \ ": [\" / \ "], \" Accept-Encoding \ ": [\" gzip, deflate \ "], \" Accept-Language \ ": [\" en-us \ "], \" Авторизация \ ": [\" AWS4-HMAC-SHA256 Credential = LNTXV0YMMZ9SY7MD0ACZ / 20170410 / us-east-1 / s3 / aws4_request, SignedHeaders = content-length; content-type; host; user-agent; x-amz-date, Signature = 7b2f4172dd926ba84c7edba5c8501b328e0 "\" \ "\" \ "keep-alive \"], \ "Content-Length \": [\ "282416 \"], \ "Content-Type \": [\ "application / octet-stream \"], \ "Host \" : [\ "my-imac.local \"], \ "User-Agent \": [\ "aws-sdk-iOS / 2.4.16 iPhone-OS / 9.1 en_US \"], \ "X-Amz-Date \ ": [\" 20170410T233620Z \ "]}}" cause = "Подпись не соответствует" source = "[object-handlers.go: 472: objectAPIHandlers.PutObjectHandler ()]"

Со стороны iOS:

Заголовки запроса:

{
    Authorization = "AWS4-HMAC-SHA256 Credential=LNTXV0YMMZ9SY7MD0ACZ/20170410/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;user-agent;x-amz-date, Signature=454c8bad35bdd3a15a08c9bf555fc69f1d5c0dabad78a474eabd4d844ca69aef";
    "Content-Length" = 282416;
    "Content-Type" = "application/octet-stream";
    Host = "my-imac.local";
    "User-Agent" = "aws-sdk-iOS/2.4.16 iPhone-OS/9.1 en_US";
    "X-Amz-Date" = 20170410T233622Z;
}

Ответ:

2017-04-10 16:36:22.507 demo[7969:4711709] AWSiOSSDK v2.4.16 [Debug] AWSURLSessionManager.m line:566 | -[AWSURLSessionManager printHTTPHeadersForResponse:] | Response headers:
{
    "Accept-Ranges" = bytes;
    Connection = close;
    "Content-Type" = "application/xml";
    Date = "Mon, 10 Apr 2017 23:36:22 GMT";
    Server = "Minio/RELEASE.2017-03-16T21-50-32Z (linux; amd64)";
    "Transfer-Encoding" = Identity;
    Vary = Origin;
    "X-Amz-Request-Id" = 14B42D7AE5B09A2B;
}

person LG01    schedule 10.04.2017    source источник
comment
Привет, не могли бы вы проверить github.com/minio/minio/issues/4039#issuecomment -293787123 и сообщите нам, решит ли это проблему, с которой вы столкнулись?   -  person koolhead17    schedule 13.04.2017
comment
@ koolhead17: да, вот и все! Спасибо   -  person LG01    schedule 14.04.2017


Ответы (1)


Пожалуйста, замените accessKey, secretKey и url, измените региональную базу на то, что вам нужно, сервис должен быть установлен на .S3

(AWSS3 автоматически удалит номер порта, если вы введете xxxx:9000 в url, в настоящее время он поддерживает только полный URL-адрес без порта, поэтому убедитесь, что у вас есть карта домена с портом 9000, вам может потребоваться обратиться к этому Настроить прокси Nginx с сервером Minio)

let accessKey = "XXXXXXX"
let secretKey = "XXXXXXX"

let credentialsProvider = AWSStaticCredentialsProvider(accessKey: accessKey, secretKey: secretKey)
let configuration = AWSServiceConfiguration(region: .USEast1, endpoint: AWSEndpoint(region: .USEast1, service: .S3, url: URL(string:"XXXXXX")),credentialsProvider: credentialsProvider)

AWSServiceManager.default().defaultServiceConfiguration = configuration

let S3BucketName = "images"
let remoteName = "test.jpg"
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(remoteName)
let image = UIImage(named: "test")
let data = UIImageJPEGRepresentation(image!, 0.9)
do {
    try data?.write(to: fileURL)
}
catch {}

let uploadRequest = AWSS3TransferManagerUploadRequest()!
uploadRequest.body = fileURL
uploadRequest.key = remoteName
uploadRequest.bucket = S3BucketName
uploadRequest.contentType = "image/jpeg"
uploadRequest.acl = .publicRead

let transferManager = AWSS3TransferManager.default()

transferManager.upload(uploadRequest).continueWith { (task: AWSTask<AnyObject>) -> Any? in
  ...
}

Полный пример проекта здесь

ПРИМЕЧАНИЕ: вам также необходимо применить следующие изменения, чтобы заставить его полностью работать https://github.com/aws/aws-sdk-ios/pull/638

person Harshavardhana    schedule 14.05.2017