Php中的签名问题导致API身份验证失败


Signature problems in Php resulting in API authentication failing

我正在尝试使用Verizon Cloud REST API获取IP地址列表。

尽管所有值都是正确的,但由于某些原因,我无法找到,因此无法进行身份验证

以下是文档链接-http://cloud.verizon.com/documentation/CloudAPIAuthentication.htm

我在这里是否做错了什么。。因为它总是返回我被禁止的访问403错误访问,而它应该为我返回401。

<?php
 ini_set('error_reporting', E_ALL);
{
//Access Key and Secret Key
$accesskey="XXXXX";
$secretkey="XXXXXXXX";
//Generating a Authorization Header data
$method = 'GET';
$host = 'https://api.cloud.verizon.com/';
$HTTPVerb = "GET";
$ContentType = "";
$CanonicalizedAmzHeaders = "";
$time=time();
$CanonicalizedResource = "api/compute/ip-address";
$string_to_sign = $HTTPVerb . "'n" .$ContentType."'n".$time ."'n".$CanonicalizedAmzHeaders."'n".$CanonicalizedResource;
$signature = base64_encode(hash_hmac('sha256', $string_to_sign, $secretkey, TRUE));
$request = 'accesskey='.$accesskey.'<BR>signaturetype=HmacSHA256<BR>signature='.$signature;
$authorization='CloudApi '.$request;
//Generating header data for x-tmrk-date and x-tmrk-noonce
date_default_timezone_set("GMT");
$date=date("D d F Y H:i:s", time())." GMT";
$noonce=time();
//auth
// Generating requests
include('./httpful.phar');
$uri='https://sjca1.cloud.verizon.com/api/';
//Sending Headers  
$response = 'Httpful'Request::options($uri)
    ->addHeaders(array(
        'Accept'=>'application/vnd.terremark.ecloud.root.v1+json',  
        'x-tmrk-authorization' => $authorization,           
        'x-tmrk-date' => $date,  
        'x-tmrk-nonce' => $noonce,           
        'Authorization' => $authorization,
        'Date' => $date,
    ))
    ->send();
echo "<pre>";
echo $response;

}?>

从您的示例来看,它看起来不像是对Headers进行了规范化。按照此处的步骤操作。:http://cloud.verizon.com/documentation/CloudAPISignatureGeneration.htm#o5461

只有当您使用x-tmrk-date时,规范化标头才是必需的。否则,请使用空行。1.检索以"x-tmrk-"开头的资源的所有标头字段,不包括x-tmrk-authorization标头字段(如果存在)。2.将每个HTTPS头字段名称转换为小写。3.按标题字段名称按字典顺序升序对标题字段进行排序。请注意,每个标头在字符串中可能只出现一次。4.通过用单个空格替换任何中断的空格来展开字符串。5.修剪页眉字段中冒号周围的任何空白。6.在生成的列表中,为每个规范化的头字段添加一个换行符。7.将此列表中的所有标头连接为一个字符串,作为CanonicalizedHeaders字符串。

构造规范化资源字符串

此签名字符串是小写的资源字符串。例如:/api/computer/vm

按照以下过程中的说明,在字符串后面添加参数。1.使用资源的解码URL(转换为小写)作为CanonicalizedResource的源。2.附加资源的URI路径,即在URI之后和任何查询参数之前的调用部分(URI的查询参数是在问号"?"之后的URI部分),后跟换行符('''n')。3.检索资源URL上的所有查询参数。提示:使用与字符"&"分隔查询参数。例如,[?[偏移量=x][&限制=y]]

4.将所有参数名称转换为小写。5.按参数名称按字典顺序升序对查询参数进行排序。6.按顺序将每个查询参数名称和值附加到字符串中,格式如下,确保名称和值之间包含冒号(:),然后在每个名称-值对后加一个换行符:参数名称:参数值''