2015-03-19 1 views
0

Я пытаюсь использовать сервис AWS S3 для размещения изображений моего приложения iOS на языке Swift. На этом этапе я просто пытаюсь просто отправить png-изображение с запросом POST. В любом запросе POST для AWS S3 нам необходимо создать заголовок авторизации, который состоит из информации, которая аутентифицирует этот запрос. Чтобы кодировать данные с помощью HMAC SHA256, который требуется Amazon, я использую проект GitHub в качестве моего подпроекта по этой ссылке: https://github.com/krzyzanowskim/CryptoSwift Это помогло мне зашифровать подпись, однако, когда я попытался отправить этот запрос, я получил сообщение об ошибке: «SignatureDoesNoMatch. Подпись запроса мы не подсчитали, что вы указали. Проверьте свой ключ и метод подписи ».Создание веб-служб Amazon S3 Запрос POST в Swift

Вот мой код:

 var img = UIImage(named: "myImage.png") 
     var imageData : NSData = UIImageJPEGRepresentation(img, 1.0) 

     let key = "mybucketname" 

     let url = NSURL(string:"http://mybucket.s3.amazonaws.com/") 
     var request = NSMutableURLRequest(URL: url!)   
     request.HTTPMethod = "POST" 

     let uniqueId = NSProcessInfo.processInfo().globallyUniqueString 
     var postBody:NSMutableData = NSMutableData() 
     var boundary:String = "------WebKitFormBoundary\(uniqueId)" 
     request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField:"Content-Type") 
//  I am trying to generate a date stamp compatible for request 
     let date = NSDate() 
     let formatter = NSDateFormatter() 
     formatter.timeStyle = .ShortStyle 
     formatter.stringFromDate(date) 

     var dateKey = ["AWS4"+"My AWSSecretKey","20150317"] 
//  Here is the signature that I'm trying to make 
     var signature = "My AWSSecretKey".sha256()?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) 
     request.addValue("AWS MYAWSACCESSKEYID:\(signature)", forHTTPHeaderField: "Authorization") 
     request.addValue("Wed, 18 Mar 2015 20:39:27 +0000", forHTTPHeaderField: "Date") 
     request.addValue(key, forHTTPHeaderField:"key") 
     request.addValue("\(postBody.length)", forHTTPHeaderField:"Content-Length") 


     postBody.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     postBody.appendData("Content-Type: image/png\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) 
     postBody.appendData(imageData) 
     var postData = String() 
     postData += "\r\n" 
     postData += "\r\n--\(boundary)--\r\n" 
     postBody.appendData(postData.dataUsingEncoding(NSUTF8StringEncoding)!) 
     request.HTTPBody = postBody 

     var error: NSError? 
     let session = NSURLSession.sharedSession() 
     var task = session.dataTaskWithRequest(request, completionHandler: { (data, response, err) -> Void in 
      var stringData = NSString(data: data, encoding: NSUTF8StringEncoding) 

      var conversionError: NSError? 
      var jsonDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableLeaves, error: &conversionError) as? NSDictionary 
     }) 
     task.resume() 

Мне нужно, чтобы узнать, как сделать правильную подпись и как я должен зашифровать его, так как его мое время пожара с помощью таких инструментов.

ответ

0

У вас не должно быть секретного ключа, жестко закодированного в вашем приложении, - это отрицает его безопасность. Я хотел бы предложить генерации ключа от вашего собственного сервера (например, используя отличный модуль Джанго S3Direct), а затем получить ключ, как это:

let filename = "myfile.mp4" 
let requestUrl = Constants.my_own_server+"/s3direct/get_upload_params/" 


println("Uploading file of name ***" + filename + "***") 

let defaults = NSUserDefaults.standardUserDefaults() 
let authToken : String = defaults.stringForKey("token")! 

let manager = Manager.sharedInstance 
manager.session.configuration.HTTPAdditionalHeaders = [ 
"Authorization": "Token " + authToken 
] 

let parameters : [ String : AnyObject] = [ 
    "type": "video/mp4", 
    "name": filename, 
    "dest": "vids" 
] 

Alamofire.request(.POST, requestUrl, parameters: parameters).response(serializer: Request.JSONResponseSerializer(), completionHandler: { (request, response, object, error) -> Void in 
    //println(object) 
    //println(error) 
    if (error == nil) { 
     self.uploadFile(videoData!, parameters: object as! [ String : String], filename: filename) 
    } 
    else { 
     print("Failed to sign file") 
    } 
}) 

удачи - я нашел этот конкретный стек необыкновенно болезненный, чтобы получить работу.

Смежные вопросы