2013-12-24 2 views
6

Я пытаюсь создать подпись для файла, хранящегося в частном порядке в Google Cloud Storage; так что я могу распространять ограниченную по времени ссылку.Создание подписанных URL-адресов для облачного хранилища Google с использованием NodeJS

В настоящее время это делает, и это делает подпись слишком короткой ... где я иду не так?

var crypto = require("crypto"); 

var ttl = new Date().getTime() + 3600; 
var id = 'the_target_file.txt'; 
var bucketName = 'bucket_name'; 
var POLICY_JSON = "GET\n" + "\n" + "\n" + ttl + "\n" + '/' + bucketName + '/' + id; 

// stringify and encode the policy 
var stringPolicy = JSON.stringify(POLICY_JSON); 
var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64"); 

// sign the base64 encoded policy 
var privateKey = "MY_PRIVATE_KEY"; 
var sha256 = crypto.createHmac("sha256", privateKey); 
var signature = sha256.update(new Buffer(base64Policy, "utf-8")).digest("base64"); 

console.log (signature); 

ответ

12

Понял, что я делаю неправильно ... Я использовал хэширование строки политики вместо ее подписания. Код ниже дает мне правильный результат.

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

var expiry = new Date().getTime() + 3600; 
var key = 'the_target_file'; 
var bucketName = 'bucket_name'; 
var accessId = 'my_access_id'; 
var stringPolicy = "GET\n" + "\n" + "\n" + expiry + "\n" + '/' + bucketName + '/' + key; 
var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64"); 
var privateKey = fs.readFileSync("gcs.pem","utf8"); 
var signature = encodeURIComponent(crypto.createSign('sha256').update(stringPolicy).sign(privateKey,"base64")); 
var signedUrl = "https://" + bucketName + ".commondatastorage.googleapis.com/" + key +"?GoogleAccessId=" + accessId + "&Expires=" + expiry + "&Signature=" + signature; 

console.log(signedUrl); 

Для полноты ... вот PHP версия, которая делает то же самое, что я использовал, чтобы проверить мои результаты

$expiry = time() + 3600; 
$key = 'the_target_file'; 
$bucketName = 'bucket_name'; 
$accessId = 'my_access_id'; 
$stringPolicy = "GET\n\n\n".$expiry."\n/".$bucketName."/".$key; 
$fp = fopen('gcs.pem', 'r'); 
$priv_key = fread($fp, 8192); 
fclose($fp); 
$pkeyid = openssl_get_privatekey($priv_key,"password"); 
if (openssl_sign($stringPolicy, $signature, $pkeyid, 'sha256')) { 
    $signature = urlencode(base64_encode($signature));  
    echo 'https://'.$bucketName.'.commondatastorage.googleapis.com/'. 
       $key.'?GoogleAccessId='.$accessId.'&Expires='.$expiry.'&Signature='.$signature; 
} 
+0

удивительные! Спасибо, что поделился. –

+0

как сократить время истечения срока действия. –

+0

Мужчина, вот почему я все еще прихожу к SO. ⭐️ – almosnow

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

  • Нет связанных вопросов^_^