How to generate Signed URL for google cloud storage objects using PHP

google-app-engine, google-cloud-storage, php

Solution

You can try Google Cloud Storage PHP SDK, it's a good choice for keeping your codes clean.

cloud-storage PHP SDK

Install package to your project by following this page on Packagist, then

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 (for Laravel)

Install and configurate superbalist/laravel-google-cloud-storage by following this page: on Github, then

public static function getSignedGcsUrl($objPath, $duration = 50)
{
    return Storage::disk('gcs'/* following your filesystem configuration */)
        ->getAdapter()
        ->getBucket()
        ->object($objPath)
        ->signedUrl(new \DateTime('+ ' . $duration . ' seconds'));
}

Problem

The method i tried using was with 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) ``` Is this the correct Method to generate signature for signed urls in google?

Original source