使用google-api-php-client无法创建正确的signedurl

时间:2014-09-01 14:36:26

标签: php authentication google-cloud-storage google-api-php-client

在我的项目中,我正在将用户的文件上传到云端存储,因此当用户想要下载该文件时,我想从谷歌云生成signedurl,以限制只能访问该特定用户的文件,所以我试过跟随PHP代码来做到这一点

`

function storageURL( $id, $method = 'GET', $duration = 10 ) { 
        $expires = time( ) + $duration*60; 
        $content_type = ($method == 'PUT') ? 'application/x-www-form-urlencoded' : ''; 
    $to_sign = ($method . "\n" .
            /* Content-MD5 */ "\n" . 
            $content_type . "\n" . 
            $expires . "\n" . s
            '/bucket/' . $id); 
    $signature = '';

    $signer = new Google_Signer_P12(file_get_contents(__DIR__.'/'."key.p12"), "notasecret");
    $signature = $signer->sign($to_sign);
    $signature = Google_Utils::urlSafeB64Encode($signature);

    return ('https://bucket.storage.googleapis.com/' . $id . 
            '?GoogleAccessId=' . 'MyServiceAccount@developer.gserviceaccount.com' . 
            '&Expires=' . $expires . '&Signature=' . $signature); 
}
echo storageURL("object_file.docx");
?>`

当我将此网址复制到浏览器的地址栏时,它会向我显示SignatureDoesNotMatch错误,我将此XML作为输出

<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>
        The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.
    </Message>
    <StringToSign>
        GET 1409582445 /bucket/object_file.docx
    </StringToSign>
</Error>

我无法理解我的代码有什么问题......

P.S。当我将其粘贴到浏览器地址栏&#34; https://bucket.storage.googleapis.com/object_file.docx&#34;

时,我可以下载该文件

2 个答案:

答案 0 :(得分:2)

查看此部分:

<StringToSign>
    GET 1409582445 /bucket/object_file.docx
</StringToSign>

这是GCS根据传入请求决定您签署的字符串。新行在某个地方被剥离了,但有三件事:GET一词,时间戳和对象的路径。

您的代码有一个字符串没有的东西:Content_Type。用户正在下载对象,因此他们不提供内容类型。将该行留空。

答案 1 :(得分:0)

我试图访问的文件名称中有空格,因为urlencoding存在一些错误,我无法为其创建正确的URL ...

因此对于没有空格的文件可以正常使用

参考 - &gt; Using google cloud storage and gsutil not able to generate valid signedurl