OAuth署名生成 PHP実装サンプル

OAuth署名生成 PHP実装サンプル

OAuth署名生成のPHPによる実装サンプルを以下に示します。

/**
 * OAuth HMAC-SHA1方式の署名を作成する.
 *
 * @param string http_method HTTPメソッドを指定
 * @param array  parameter    クエリパラメータとOAuthパラメータをマージしたもの
 * @param string uri                 実際にリクエストするURI(リクエストパラメータは含めない)
 * @param string secret           秘密鍵
 *
 * @return string 作成した署名。作成失敗した場合はNULL
 */
function make_signature_hmac($http_method, $parameter, $uri, $secret)
{
  // http_method
  $http_method = strtoupper($http_method);
 
  // uri
  $parts = parse_url($uri);
  $scheme = (isset($parts['scheme'])) ? $parts['scheme'] : 'http';
  $port = (isset($parts['port']))
            ? $parts['port'] : (($scheme === 'https') ? '443' : '80');
  $host = (isset($parts['host'])) ? strtolower($parts['host']) : '';
  $path = (isset($parts['path'])) ? $parts['path'] : '';
  if (($scheme === 'https' && $port != '443')
      || ($scheme === 'http' && $port != '80')) {
      $host = "$host:$port";
  }
  $uri = "$scheme://$host$path";
 
  // params
  if (array_key_exists('oauth_signature', $parameter)) {
    unset($parameter['oauth_signature']);
  }
 
  if (empty($parameter)) return NULL;
  $keys   = array_map('rawurlencode', array_keys($parameter));
  $values = array_map('rawurlencode', array_values($parameter));
  $parameter = array_combine($keys, $values);
  uksort($parameter, 'strcmp');
  $pairs = array();
  foreach ($parameter as $key => $value) {
    if (is_array($value)) {
      sort($value, SORT_STRING);
      foreach ($value as $duplicate_value) {
        $pairs[] = $key . '=' . $duplicate_value;
      }
    } else {
      $pairs[] = $key . '=' . $value;
    }
  }
  $params = implode('&', $pairs);
 
  // base_string
  $parts = array($http_method, $uri, $params);
  $parts = array_map('rawurlencode', $parts);
  $base_string = implode('&', $parts);
 
  // 2-leggedではtokenは使わないのでそのまま&を結合
  $key = $secret . '&';
  $signature = base64_encode(hash_hmac('sha1', $base_string, $key, true));
  return ($signature === FALSE) ? NULL : $signature;
}