Я пытаюсь реализовать запрос скручивания Oauth 1.0, используя php
, codeignitor
.
У меня есть ключ потребителя, секрет, ключ oauth и секрет. Apis отлично работает с почтальоном. Тем не менее, когда я пытаюсь нажать, используя код, он говорит signature invalid
. Я пробовал много разных реализаций кода. curl
запрос, сгенерированный из кода почтальона, дает успех только один раз (с другим значением nonce).
, пожалуйста, помогите.
function myfunction(){
$oauthToken = $this->config->item('amazon_oauth_token');
$oauthSecret = $this->config->item('amazon_oauth_token_secret');
$clientKey = $this->config->item('amazon_oauth_consumer_key');
$clientSecret = $this->config->item('amazon_oauth_consumer_secret');
$url = $this->config->item('amazon_url') . 'orders';
$oauthTimestamp = time();
$nonce = substr(md5(mt_rand()),0,10);
$oauthSignatureMethod = "HMAC-SHA1";
$oauthVersion = "1.0";
$param = array(
'oauth_consumer_key' => $clientKey,
'oauth_nonce' => $nonce,
'oauth_signature_method' => $oauthSignatureMethod,
'oauth_timestamp' => $oauthTimestamp,
'oauth_version' => '1.0',
'oauth_token'=>$oauthToken
);
$keys = array(
'clientSecret'=>$clientSecret,
'oauthSecret'=>$oauthSecret
);
$head = [
'Authorization: '.protocolHeader('POST', $url, $param, array(), $keys)
];
x = curlRequest($url, $head,array());
}
function curlRequest($url, $headers, $data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
if($data)
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$resp = curl_exec($ch);
return array("resp"=>json_decode($resp), "code"=>curl_getinfo($ch, CURLINFO_HTTP_CODE));
}
function sign($uri, $keys = array(),array $parameters = array(), $method = 'POST')
{
$url = urlencode($uri);
$baseString = baseString($url, $method, $parameters);
$key = rawurlencode($keys['clientSecret']).'&'. rawurlencode($keys['oauthSecret']);
return base64_encode(hash_hmac('sha1', $baseString, $key, true));
}
function baseString( $url, $method = 'POST', array $parameters = array())
{
$baseString = rawurlencode($method).'&';
$baseString .= rawurlencode($url).'&';
return $baseString;
}
function protocolHeader($method, $uri, array $parameters, array $bodyParameters = array(), array $keys)
{
$parameters['oauth_signature'] = sign(
$uri,
$keys,
array_merge($parameters, $bodyParameters),
$method,
);
array_walk($parameters, function (&$value, $key) {
$value = rawurlencode($key).'="'.rawurlencode($value).'"';
});
return 'OAuth '.implode(', ', $parameters);
}
edit ::
что-то так просто как это тоже не работает:
$base = "POST&" . rawurlencode($url) . "&"
. "oauth_consumer_key=" . rawurlencode($clientKey)
. "&oauth_nonce=" . rawurlencode($nonce)
. "&oauth_signature_method=" . rawurlencode($oauthSignatureMethod)
. "&oauth_timestamp=" . rawurlencode($oauthTimestamp)
. "&oauth_token=" . rawurlencode($oauthToken)
. "&oauth_version=" . rawurlencode($oauthVersion);
$key = rawurlencode($clientSecret) . '&' . rawurlencode($oauthSecret);
$signature = base64_encode(hash_hmac('sha1', $base, $key, true));
$authHeader = "Authorization: OAuth oauth_consumer_key=\"{$clientKey}\",oauth_nonce=\"{$nonce}\",oauth_signature_method=\"{$oauthSignatureMethod}\",oauth_timestamp=\"{$oauthTimestamp}\",oauth_token=\"{$oauthToken}\",oauth_version=\"{$oauthVersion}\",oauth_signature=\"{$signature}\"";
$head = [
$authHeader
];
curl($url, $head, $data);