Реализация Oauth 1 PHP - PullRequest
       17

Реализация Oauth 1 PHP

0 голосов
/ 20 апреля 2020

Я пытаюсь реализовать запрос скручивания 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);
...