Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php中的签名问题导致API身份验证失败_Php_Api_Hmacsha1 - Fatal编程技术网

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

Php中的签名问题导致API身份验证失败,php,api,hmacsha1,Php,Api,Hmacsha1,我正在尝试使用Verizon Cloud REST API获取IP地址列表 尽管所有的值都是正确的,但由于一些我无法找到的原因,我无法进行身份验证 以下是文档的链接- 我在这里是否做错了…因为它总是返回禁止访问403错误访问,而它应该为我返回401 <?php ini_set('error_reporting', E_ALL); { //Access Key and Secret Key $accesskey="XXXXX"; $secretkey="XXXXXXXX"; //Gen

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

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

以下是文档的链接-

我在这里是否做错了…因为它总是返回禁止访问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;

在您的示例中,看起来并没有规范化标题。按照此处的步骤操作:

只有在使用x-tmrk-date时,才需要规范化标题。否则,请使用空行。 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.按照以下格式将每个查询参数名称和值按顺序追加到字符串中,确保名称和值之间包含冒号(:),每个名称-值对后面紧跟一个换行符: 参数名称:参数值\