Php AWS创建POST policy base64编码+;签名

Php AWS创建POST policy base64编码+;签名,php,amazon-web-services,sdk,signature,Php,Amazon Web Services,Sdk,Signature,我试图用PHP生成一个AWS POST策略w/签名,它将被发送到客户端,以便通过javascript AJAX在浏览器中上传 我在http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 我有两个问题: 我无法从策略生成正确编码的base64字符串 $policy = '{ "expiration": "2013-08-06T12:00:00.000Z", "conditions": [{"bucket": "e

我试图用PHP生成一个AWS POST策略w/签名,它将被发送到客户端,以便通过javascript AJAX在浏览器中上传

我在
http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html

我有两个问题:

  • 我无法从策略生成正确编码的base64字符串

    $policy = '{ "expiration": "2013-08-06T12:00:00.000Z", "conditions": [{"bucket": "examplebucket"}, ["starts-with", "$key", "user/user1/"], {"acl": "public-read"}, {"success_action_redirect": "http://acl6.s3.amazonaws.com/successful_upload.html"}, ["starts-with", "$Content-Type", "image/"], {"x-amz-meta-uuid": "14365123651274"}, ["starts-with", "$x-amz-meta-tag", ""], {"x-amz-credential": "AKIAIOSFODNN7EXAMPLE/20130806/us-east-1/s3/aws4_request"}, {"x-amz-algorithm": "AWS4-HMAC-SHA256"}, {"x-amz-date": "20130806T000000Z"}]}';
    $base64 = base64_encode($policy);
    //Result
    //eyAiZXhwaXJhdGlvbiI6ICIyMDEzLTA4LTA2VDEyOjAwOjAwLjAwMFoiLCAiY29uZGl0aW9ucyI6IFt7ImJ1Y2tldCI6ICJleGFtcGxlYnVja2V0In0sIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJ1c2VyL3VzZXIxLyJdLCB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LCB7InN1Y2Nlc3NfYWN0aW9uX3JlZGlyZWN0IjogImh0dHA6Ly9hY2w2LnMzLmFtYXpvbmF3cy5jb20vc3VjY2Vzc2Z1bF91cGxvYWQuaHRtbCJ9LCBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sIHsieC1hbXotbWV0YS11dWlkIjogIjE0MzY1MTIzNjUxMjc0In0sIFsic3RhcnRzLXdpdGgiLCAiJHgtYW16LW1ldGEtdGFnIiwgIiJdLCB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxMzA4MDYvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LCB7IngtYW16LWFsZ29yaXRobSI6ICJBV1M0LUhNQUMtU0hBMjU2In0sIHsieC1hbXotZGF0ZSI6ICIyMDEzMDgwNlQwMDAwMDBaIn1dfQ==
    
  • 这是我的utf8_encode()策略。当我尝试对其进行base64编码时,它与示例base64策略不同。无论我做什么,似乎都无法让它匹配。我注意到将日期更改为
    2013-08-07T12:00:00.000Z
    会使其与编码字符串的该部分匹配

  • 我无法使用正确编码的base64策略通过sha256生成正确的签名
  • 从示例的base64编码策略创建签名:

        //Using this example secret key:
        $secret = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';
        $policy = 'eyAiZXhwaXJhdGlvbiI6ICIyMDEzLTA4LTA3VDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJleGFtcGxlYnVja2V0In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIka2V5IiwgInVzZXIvdXNlcjEvIl0sDQogICAgeyJhY2wiOiAicHVibGljLXJlYWQifSwNCiAgICB7InN1Y2Nlc3NfYWN0aW9uX3JlZGlyZWN0IjogImh0dHA6Ly9leGFtcGxlYnVja2V0LnMzLmFtYXpvbmF3cy5jb20vc3VjY2Vzc2Z1bF91cGxvYWQuaHRtbCJ9LA0KICAgIFsic3RhcnRzLXdpdGgiLCAiJENvbnRlbnQtVHlwZSIsICJpbWFnZS8iXSwNCiAgICB7IngtYW16LW1ldGEtdXVpZCI6ICIxNDM2NTEyMzY1MTI3NCJ9LA0KICAgIFsic3RhcnRzLXdpdGgiLCAiJHgtYW16LW1ldGEtdGFnIiwgIiJdLA0KDQogICAgeyJ4LWFtei1jcmVkZW50aWFsIjogIkFLSUFJT1NGT0ROTjdFWEFNUExFLzIwMTMwODA2L3VzLWVhc3QtMS9zMy9hd3M0X3JlcXVlc3QifSwNCiAgICB7IngtYW16LWFsZ29yaXRobSI6ICJBV1M0LUhNQUMtU0hBMjU2In0sDQogICAgeyJ4LWFtei1kYXRlIjogIjIwMTMwODA2VDAwMDAwMFoiIH0NCiAgXQ0KfQ==';
    
    
        <?= hash_hmac('sha256', $policy, $secret); ?>
    
        //Resulting Signature
        d8ddc156c5d681b42c40a4224c07cdd64b938def8e8c34d616806175cb3c7119
    
        //Signature in Example
        21496b44de44ccb73d545f1a995c68214c9cb0d41c45a17a5daeec0b1a6db047
    
    //使用此示例密钥:
    $secret='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';
    $policy=“Eyaizxhwaxjhdglvbii6icicyzmlta4lta3vdeyojawjawjawfoila0kicaiy2uzglo9ucyic7imj1tldci6icjlegftcggzlynvja2in0sdqoggicagwyzdgyzfyHmtd2acisica2v5iwginvxvidxiv2nlc6e0sdg2eqogi2wiaichvic7iny2ny2n2ny2ny2ny2ny2ny2ny2ny2ny2nzgzg2czg2czy2czyzy2czg2czyzg2vzy2czy2czy2czzy2czzy2czzy2czy2czy2czy2czy2czzzAHRTBCJ9LA0KICAGIFSIC3RHCNRZLXDPDGGILCAIJENVBNRLBNQTVHLWZSIcJWfNzZIXSWNCIAGICB7LW1DGETDxVpZCI6ICIxNdM2NteymzY3Nc9LA0KICAGIFSIC3RZLZLXDGILJGTYW16LW16LWdLWdLWdLwKdLwKzW50AWFSIjKfKfKfKfJJt1NzLwKfJt1NGLwKfLzLwKf1NzLwKf1NzLwKf1NzLwKf1NzLwKf1NzLwKf1NzZZZZZIzIzIzIzIzIzIzIzIzIzIzIzIzIzIzIz1M0LUHQUMTU0HBMJU2IN0SDQOGICAGEJ4LWFTEI1KYXRIJOGIWIWMTODA2VDAWMDAWMFOIIH0NCIAGXQ0KFQ==';
    //结果签名
    d8ddc156c5d681b42c40a4224c07cdd64b938def8e8c34d616806175cb3c7119
    //示例中的签名
    21496b44de44ccb73d545f1a995c68214c9cb0d41c45a17a5daeec0b1a6db047
    

    不知道我在这里错过了什么。我也有PHPSDK,但我无法找到一种方法来提取策略/签名,以便将其发送到浏览器中的javascript。有没有一种方法可以从PHP SDK生成具有我指定条件的策略?我在网上和SDK中四处查看,结果发现是空的…

    我用

    $policydoc = <<<EOT
    {"expiration": "2016-01-01T00:00:00Z",
      "conditions": [ 
        {"bucket": "{$bucket}"}, 
        ["starts-with", "\$key", "uploads/"],
        {"acl": "private"},
        {"success_action_redirect": "$success_action_redirect"},
        ["content-length-range", 0, 1048576]
      ]
    }
    EOT;
    
    $policydoc = base64_encode($policydoc);
    $signature = base64_encode(hash_hmac('sha1', $policydoc,  $provider->getSecretKey(), true));
    

    $policydoc=这方面运气好吗?