无法签署 url 以使用云存储
Cannot get signed url to work with gcloud storage
无法签署 url 以使用 gcloud 存储。
我知道这里可能缺少一些简单的东西,但我找不到。
正在尝试按照此处的说明 https://cloud.google.com/storage/docs/access-control/create-signed-urls-program
在 gcloud 存储桶中为文件创建签名 url
创建了一个服务帐户并下载了pk12并将p12转换为pem以获得密钥。
代码如下:
$pkeyid = "-----BEGIN RSA PRIVATE KEY-----
[removed actual key]
-----END RSA PRIVATE KEY-----";
$secret = "notasecret";
$expires = time()+86400;
$http_method = "GET";
$bucketName = "mybucketname";
$stringtosign = "GET\n
\n
text/plain\n
".$expires."\n
\n
\n
\n
".$bucketName ."/mymediafile.mp4";
openssl_sign($stringtosign, $signature, $pkeyid);
$emailid="serviceaccount@[project].iam.gserviceaccount.com";
$signature = urlencode(base64_encode($signature));
$gcloudloc = "https://storage.googleapis.com/".$bucketName ."/mymediafile.mp4?GoogleAccessId=".$emailid."&Expires=".$expires."&Signature=".$signature;
我得到了一个看起来有效的签名,但是当我尝试使用完整的 url 时,我得到了
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
我有两个问题:
- 粘贴私钥。
- openssl_sign
中缺少一些参数
- 我的 $stringtosign 似乎也搞砸了。更改为全部一行修复了该部分。
我找到了这个“Google Cloud Storage Signed Url for media”,并且能够使用 hdezela 的功能(如下)使其正常工作!
function storageURL($bucket,$archivo) {
$expires = time()+60;
$to_sign = ("GET\n\n\n".$expires."\n/".$bucket.'/'.$archivo);
$fp = fopen('/path/to/google.pem', 'r');
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);
if(!openssl_sign($to_sign,$signature,$pkeyid,'sha256')) {
$signature = 'sinfirma';
} else {
$signature = urlencode(base64_encode($signature));
}
return ('https://'.$bucket.'.storage.googleapis.com/'.$archivo.'?GoogleAccessId=XXXXXXX@developer.gserviceaccount.com&Expires='.$expires.'&Signature='.$signature);
}
我原本以为是 url 但这个也行。
"https://storage.googleapis.com/".$bucketName ."/
无法签署 url 以使用 gcloud 存储。
我知道这里可能缺少一些简单的东西,但我找不到。
正在尝试按照此处的说明 https://cloud.google.com/storage/docs/access-control/create-signed-urls-program
在 gcloud 存储桶中为文件创建签名 url创建了一个服务帐户并下载了pk12并将p12转换为pem以获得密钥。
代码如下:
$pkeyid = "-----BEGIN RSA PRIVATE KEY-----
[removed actual key]
-----END RSA PRIVATE KEY-----";
$secret = "notasecret";
$expires = time()+86400;
$http_method = "GET";
$bucketName = "mybucketname";
$stringtosign = "GET\n
\n
text/plain\n
".$expires."\n
\n
\n
\n
".$bucketName ."/mymediafile.mp4";
openssl_sign($stringtosign, $signature, $pkeyid);
$emailid="serviceaccount@[project].iam.gserviceaccount.com";
$signature = urlencode(base64_encode($signature));
$gcloudloc = "https://storage.googleapis.com/".$bucketName ."/mymediafile.mp4?GoogleAccessId=".$emailid."&Expires=".$expires."&Signature=".$signature;
我得到了一个看起来有效的签名,但是当我尝试使用完整的 url 时,我得到了
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
我有两个问题:
- 粘贴私钥。
- openssl_sign 中缺少一些参数
- 我的 $stringtosign 似乎也搞砸了。更改为全部一行修复了该部分。
我找到了这个“Google Cloud Storage Signed Url for media”,并且能够使用 hdezela 的功能(如下)使其正常工作!
function storageURL($bucket,$archivo) {
$expires = time()+60;
$to_sign = ("GET\n\n\n".$expires."\n/".$bucket.'/'.$archivo);
$fp = fopen('/path/to/google.pem', 'r');
$priv_key = fread($fp, 8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key);
if(!openssl_sign($to_sign,$signature,$pkeyid,'sha256')) {
$signature = 'sinfirma';
} else {
$signature = urlencode(base64_encode($signature));
}
return ('https://'.$bucket.'.storage.googleapis.com/'.$archivo.'?GoogleAccessId=XXXXXXX@developer.gserviceaccount.com&Expires='.$expires.'&Signature='.$signature);
}
我原本以为是 url 但这个也行。
"https://storage.googleapis.com/".$bucketName ."/