我尝试使用的方法是使用openssl
$fp = fopen($key, 'r'); //open the PEM file
$priv_key = fread($fp,8192);
fclose($fp);
$pkeyid = openssl_get_privatekey($priv_key,"password");
openssl_sign($response["data_to_sign"], $signature, $pkeyid,'sha256');
$sign = base64_encode($signature)
这是在Google中为签名网址生成签名的正确方法吗?
答案 0 :(得分:4)
我将所有答案放在一起。这应该是开箱即用的项目。如果路径中有空格,则需要rawurlencode
各个组件,而不是urlencode
。
function signedGoogleStorageURL($bucketName, $resourcePath, $duration = 10, $method = 'GET')
{
$expires = time() + $duration;
$content_type = ($method == 'PUT') ? 'application/x-www-form-
urlencoded' : '';
$to_sign = ($method . "\n" .
/* Content-MD5 */ "\n" .
$content_type . "\n" .
$expires . "\n" .
"/" . $bucketName . $resourcePath);
$sign_result = AppIdentityService::signForApp($to_sign);
$signature = urlencode(base64_encode($sign_result['signature']));
$email = AppIdentityService::getServiceAccountName();
return ('https://storage.googleapis.com/' . $bucketName .
$resourcePath .
'?GoogleAccessId=' . $email .
'&Expires=' . $expires .
'&Signature=' . $signature);
}
$signedPath = signedGoogleStorageURL(AppIdentityService::getDefaultVersionHostname(), "/my_folder/my_file", 60);
答案 1 :(得分:2)
有一点需要注意,我花了大约两个小时:
您传入网址的GoogleAccessId是Google Cloud Console“证书”部分中的电子邮件地址。正如Google在其文档中所建议的那样,这不是带有字符串替换的OAuth客户端ID。
答案 2 :(得分:2)
我使用Google Cloud Storage PHP SDK,脚本的手动部分非常简单并且看上去很干净。
按照此页面将软件包安装到项目中 on Packagist, 然后
function getSignedGcsUrl($objPath/* which is your target object path */, $duration = 50)
{
$storageClient = new StorageClient([
'projectId' => /* your gcp projectId here */,
'keyFilePath' => /* your gcp keyFilePath here */,
]);
$bucket = $storageClient->bucket($objPath);
$object = $bucket->object();
$url = $object->signedUrl(new \DateTime('+ ' . $duration . ' seconds'));
return $url;
}
通过遵循以下页面来安装和配置superbalist / laravel-google-cloud-storage: on Github, 然后
public static function getSignedGcsUrl($objPath, $duration = 50)
{
return Storage::disk('gcs'/* following your filesystem configuration */)
->getAdapter()
->getBucket()
->object($objPath)
->signedUrl(new \DateTime('+ ' . $duration . ' seconds'));
}
答案 3 :(得分:1)
这里有一个示例,使用PHP为Google云端存储分配网址: https://groups.google.com/forum/#!msg/google-api-php-client/jaRYDWdpteQ/xbNTLfDhUggJ
然而 - 我注意到这是用Google App Engine标记的......如果您的代码在Google App Engine中运行,您应该使用内置的App Identity服务 - (请注意,这仅在部署应用程序后才有效在生产中,而不是在本地运行时) - 这意味着您不需要下载或处理任何私钥:
require_once 'google/appengine/api/app_identity/AppIdentityService.php';
$sign_result = AppIdentityService::signForApp( $message );
您需要确保将与App Engine应用程序关联的服务帐户添加到拥有云存储分区的项目的团队中。