如何使用PHP为Google云端存储对象生成签名URL

时间:2013-12-10 11:20:30

标签: php google-app-engine google-cloud-storage

我尝试使用的方法是使用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中为签名网址生成签名的正确方法吗?

4 个答案:

答案 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,脚本的手动部分非常简单并且看上去很干净。

云存储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;
}

laravel-google-cloud-storage(用于Laravel)

通过遵循以下页面来安装和配置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应用程序关联的服务帐户添加到拥有云存储分区的项目的团队中。