0

HTMLフォームを使用してPOST経由でGCEにファイルをアップロードしようとしましたが、これまでのところ次のエラーメッセージが表示され続けています。

計算したリクエストの署名が、提供された署名と一致しません。Google 秘密鍵と署名方法を確認してください。

gcs.php というファイルにあるサンプル コードを次に示します。

 <?php
       $bucketName = “BUCKET_NAME";
       $accessId = “ACCESS_ID";

function generateGcsSignature($bucketName, $filePath, $params=array()){

         if($params['ttl'] < 300) {
          $params['ttl'] = 300; // 5 mins
        }

        $expiry = time() + $params['ttl'];

        $valid_methods = array("PUT","GET", "POST");
        $method = "";
        if(!isset($params["method"]) || !in_array($params['method'], $valid_methods))
           $method = "GET";
        else
            $method = $params["method"];

        $parts = array($params['method'], "", "", $expiry, "/$bucketName/$filePath");
        $stringPolicy = implode("\n", $parts);

        $fp = fopen("../gcs-key.pem", "r");
        $priv_key = fread($fp, 8192);
        fclose($fp);
        $pkeyid = openssl_get_privatekey($priv_key, "");

        $signSuccess = openssl_sign($stringPolicy, $signature, $pkeyid, 'sha256' );
        $openssl_error = openssl_error_string();

        if ($signSuccess) {
           $signature = urlencode( base64_encode( $signature ) );
           global $accessId;
           return $signature;
        }

}

function generatePolicy(){

         $policy = '
         {"expiration": "'.date("c", time()+300).'",
           "conditions": [
                ["starts-with", "key", "" ],
                {"acl": "bucket-owner-read" },
                {"bucket": "BUCKET_NAME"},
                {"success_action_redirect": "http://www.example.com/success_notification.html" },
                ["eq", "Content-Type", "image/jpeg" ],
                ["content-length-range", 0, 1000000]
           ]
         }';

         $policy = base64_encode(trim($policy));

         $fp = fopen("../gcs-key.pem", "r");
        $priv_key = fread($fp, 8192);
        fclose($fp);
        $pkeyid = openssl_get_privatekey($priv_key, "");

        $signSuccess = openssl_sign($policy, $signature, $pkeyid, 'sha256' );
        $openssl_error = openssl_error_string();

        if ($signSuccess) {
           $signature = urlencode( base64_encode( $signature ) );
           global $accessId;
           return $signature;
        }

}


       $signature = generateGcsSignature($bucketName, $key, array("ttl" => "300", "method" => "POST"));
       $policy = generatePolicy();
    ?>
    <form action="http://<?=$bucketName?>.storage.googleapis.com" method="post" enctype="multipart/form-data">
    <input type="text" name="key" value="asdfasdf.jpg">
    <input type="hidden" name="bucket" value="<?=$bucketName?>">
    <input type="hidden" name="Content-Type" value="image/jpeg">
    <input type="hidden" name="GoogleAccessId" value="<?=$accessId?>">
    <input type="hidden" name="acl" value="bucket-owner-read">
    <input type="hidden" name="success_action_redirect" value="http://www.example.com/success_notification.html">
    <input type="hidden" name="policy" value="<?=$policy?>"/>
    <input type="hidden" name="signature" value="<?=$signature?>">

    <input name="file" type="file">
    <input type="submit" value="Upload">
    </form>

コードで BUCKET_NAME と ACCESS_ID が適切な値に設定されていることに注意してください。指定したバケット内のファイルに対して GET を実行できたので、これを確認できます。

私はこの問題の解決策を探していましたが、これまでのところうまくいきませんでした. 私が得ることができる助けをいただければ幸いです!

4

1 に答える 1