【问题标题】:The MAC signature found in the HTTP request is not the same as any computed signature azure integration using php在 HTTP 请求中找到的 MAC 签名与使用 php 的任何计算签名 azure 集成不同
【发布时间】:2017-04-12 17:28:14
【问题描述】:

我正在尝试使用 azure rest API 列出 blob。我正在使用下面的代码列出使用 curl 和 php 的 blob,看起来生成的身份验证签名是错误的,谁能帮我解决授权问题。

$date = gmdate('D, d M Y H:i:s \G\M\T');
$account_name = "xyz";
$containername = "abc";
$account_key = "asdf";

$stringtosign = "GET\n\n\n$date\n/$account_name/$containername()";
$signature = 'SharedKey'.' '.$account_name.':'.base64_encode(hash_hmac('sha256', $stringtosign, base64_decode($account_key),true));

$endpoint = 'https://'.$account_name.'.blob.core.windows.net';
$url = $endpoint.'/'.$containername.'?restype=container&comp=list'; 

$headers = [
    "x-ms-date:{$date}",
    'x-ms-version:2014-02-14',
    'Accept:application/json;odata=nometadata',
    "Authorization:{$signature}"
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
echo curl_error($ch);
curl_close($ch);        
echo '<pre>';print_r($response);

我收到以下错误

AuthenticationFailedServer failed to authenticate the request. Make sure the 

value of Authorization header is formed correctly including the signature.
RequestId:sdf4b5-0341-043559-2sdf53-b3sdf000
Time:2017-04-12T06:10:18.8696178ZThe MAC signature found in the HTTP request 'sfdf98i8p7f1QiJwszds' is not the same as any computed signature. Server used following string to sign: 'GET
x-ms-date:Wed, 12 Apr 2017 06:10:17 GMT
x-ms-version:2014-02-14
/abc/xyz
comp:list
restype:container'.

【问题讨论】:

    标签: php azure azure-blob-storage


    【解决方案1】:

    我已将您的代码更改为如下所示,然后就可以使用了。

    <?php
    
    $date = gmdate('D, d M Y H:i:s \G\M\T');
    $account_name = "xyz";
    $containername = "abc";
    $account_key = "asdf";
    
    $canonicalizedHeaders  = "x-ms-date:$date\nx-ms-version:2014-02-14";
    $canonicalizedResource = "/$account_name/$containername\ncomp:list\nrestype:container";
    
    $arraysign = array();
    $arraysign[] = 'GET';                     /*HTTP Verb*/  
    $arraysign[] = '';                        /*Content-Encoding*/  
    $arraysign[] = '';                        /*Content-Language*/  
    $arraysign[] = '';                        /*Content-Length (include value when zero)*/  
    $arraysign[] = '';                        /*Content-MD5*/  
    $arraysign[] = '';                        /*Content-Type*/  
    $arraysign[] = '';                        /*Date*/  
    $arraysign[] = '';                        /*If-Modified-Since */  
    $arraysign[] = '';                        /*If-Match*/  
    $arraysign[] = '';                        /*If-None-Match*/  
    $arraysign[] = '';                        /*If-Unmodified-Since*/  
    $arraysign[] = '';                        /*Range*/  
    $arraysign[] = $canonicalizedHeaders;     /*CanonicalizedHeaders*/
    $arraysign[] = $canonicalizedResource;    /*CanonicalizedResource*/
    
    $stringtosign = implode("\n", $arraysign);
    
    $signature = 'SharedKey'.' '.$account_name.':'.base64_encode(hash_hmac('sha256', $stringtosign, base64_decode($account_key), true));
    
    $endpoint = 'https://'.$account_name.'.blob.core.windows.net';
    $url = $endpoint.'/'.$containername.'?restype=container&comp=list'; 
    
    $headers = [
        "x-ms-date:{$date}",
        'x-ms-version:2014-02-14',
        'Accept:application/json;odata=nometadata',
        "Authorization:{$signature}"
    ];
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response  = curl_exec($ch);
    echo curl_error($ch);
    curl_close($ch);        
    echo '<pre>';print_r($response);
    

    【讨论】:

    • 它有效!..从过去两天开始,我一直在尝试修复它。非常感谢
    • 嗨,我尝试了代码,但仍然遇到同样的错误。有什么想法吗?
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多