2016-09-24 6 views
2

Google Cloud Storage(GCS)に画像を保存するプロジェクトに取り組んでいます。私は以下のコードでNodeJSサーバーを実行しています。ファイルは、GCSで再開可能なアップロード用の署名付きURLとともにサーバーに送信されます。ファイル全体をバフ処理した後、サーバーはそのアドレスに要求を送ります。Google Cloud Storageがお客様の提供する暗号化キーヘッダーを無視するように見える

その部分は機能します。しかし、customer-supplied encryption keyを指定するリクエストにヘッダーを追加すると、GCSはそれらを無視します。アップロードが完了し、200を返し、デフォルトの暗号化キーが適用されます。

は私 400得ているはずです x-goog-encryption-algorithm、ために不正な値を試したときに、それが正常にアップロードしました。

私は非常に近いはずですが、お客様が入力した暗号化キーを指定するために欠けているヘッダーや構成はありますか?

var crypto = require("crypto"); 
var fs = require("fs"); 
var Request = require("request"); 

var hashKey = function(key) { 
    var hash = crypto.createHash("sha256"); 
    key = new Buffer(key); 
    hash.update(key); 
    return hash.digest("base64"); 
}; 

var GCS = module.exports = function GCS(env) { 
    // config contains the encryption key I'd like to specify. 
    this.config = env.config 
}; 

GCS.prototype.upload = function (url, buffer) { 
    var self = this; 
    return new Promise(function(resolve, reject) { 
    var headers = { 
     "Content-Length": buffer.size, 
     "x-goog-encryption-algorithm": "AES256", 
     "x-goog-encryption-key": self.config.encryption.key, 
     "x-goog-encryption-key-sha256": hashKey(self.config.encryption.key) 
    }; 

    var options = { 
     url: url, 
     method: "PUT", 
     headers: headers 
    }; 

    fs.createReadStream(buffer.path) 
    .pipe(Request(options)) 
    .on("error", function(e) { 
     self.logger.error("Failed to upload asset to slot.", e); 
     reject(e); 
    }) 
    .on("response", function(res){ 
     if (res.statusCode != 200) { 
     reject(new Error("Unexpected response code" + res)); 
     } 
     resolve(res); 
    }); 
    }); 
}; 

答えて

1

再開可能なアップロードの場合は、アップロードURLを作成する最初のPOSTで同じ暗号化ヘッダーを送信する必要があります。

+1

それはトリックでした。ありがとうございました! – freeformflow

関連する問題