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

问题描述:

我想使用Verizon Cloud REST API获取IP地址列表。Php中的签名问题导致API身份验证失败

Eventhough所有的值是正确的,我无法验证,由于一些原因而我无法找到

下面是对文件的链接 - 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; 

} ?>

从你的榜样,它看起来并不像你规范化的标题。请按照这里的步骤。:http://cloud.verizon.com/documentation/CloudAPISignatureGeneration.htm#o5461

Canonicalized标题只有当您使用x-tmrk日期时才需要。否则,请使用空白行。 1.检查以“x-tmrk-”开头的资源的所有头字段(不包括x-tmrk-authorization头字段)(如果存在)。 2.将每个HTTPS标头字段名称转换为小写。 3.按照字段名称按升序排列标题字段。请注意,每个标题在字符串中只能出现一次。 4.通过用一个空格替换任何打破的空格来展开字符串。 5.在标题字段中围绕冒号的任何空格。 6.为结果列表中的每个规范化标题字段添加一个换行符。 7.将此列表中的所有标题连接为一个字符串作为CanonicalizedHeaders字符串。

构建CanonicalizedResource串

这个签名串是小写的资源字符串。例如: /api/compute/vm

按照带参数的字符串,如以下过程所述。 1.使用已转换为全部小写字母的已解码资源的URL作为CanonicalizedResource的源。 2.添加资源的URI路径,在URI之后和任何查询参数(URI的查询参数是问号之后的URI的一部分“?”)之前的部分调用,然后是换行符(' \ n')字符。 3.检索资源URL上的所有查询参数。 提示:使用与号字符“&”分隔查询参数。例如,[?[offset = x] [& limit = y]]

4.将所有参数名称转换为小写。 5.按参数名称按升序排列查询参数。 6.按照以下格式依次将每个查询参数名称和值附加到字符串中,确保在名称和值之间包含冒号(:),并在每个名称 - 值对之后包含换行符:参数名称:参数值\