Передача аргументов через POST с расширением OAuth PHP / PECL - PullRequest
3 голосов
/ 20 марта 2011

Я довольно новичок в концепции OAuth и пытаюсь взаимодействовать с новым Rdio API. Мне удалось выяснить аутентификацию, используя функции PECL OAuth, но Rdio требует, чтобы аргументы передавались через POST, и я не могу понять, как это сделать. Аутентификация работает: пользователь возвращается на сайт Rdio и просит подтвердить заявку, а затем он возвращается на сайт. Однако после этого запрос на вызов API не выполняется.

Вот некоторая информация об API Rdio: http://developer.rdio.com/docs/REST/

Вот код, который у меня есть для аутентификации ... я считаю, что строки, выделенные курсивом, должны вызывать API, запрашивающий метод с именем "currentUser"

$req_url = 'http://api.rdio.com/oauth/request_token';
$authurl = 'https://www.rdio.com/oauth/authorize';
$acc_url = 'http://api.rdio.com/oauth/access_token';
$callback = 'http://localhost/test.php';
$api_url = 'http://api.rdio.com/1';
$conskey = 'vmu7x6u4rk8vae8dn28h';
$conssec = 'GrY7gF';

session_start();

if(!isset($_GET['oauth_token']) && $_SESSION['state']==1) $_SESSION['state'] = 0;
try {
  $oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
  $oauth->enableDebug();
  if(!isset($_GET['oauth_token']) && !$_SESSION['state']) {
    $request_token_info = $oauth->getRequestToken($req_url);
    $_SESSION['secret'] = $request_token_info['oauth_token_secret'];
    $_SESSION['state'] = 1;
    header('Location: '.$authurl.'?oauth_token='.$request_token_info['oauth_token'].'&oauth_callback='.urlencode($callback));
    exit;
  } else if($_SESSION['state']==1) {
    $oauth->setToken($_GET['oauth_token'],$_SESSION['secret']);
    $access_token_info = $oauth->getAccessToken($acc_url);
    $_SESSION['state'] = 2;
    $_SESSION['token'] = $access_token_info['oauth_token'];
    $_SESSION['secret'] = $access_token_info['oauth_token_secret'];
  } 

  $args = "method=currentUser";

  $oauth->setToken($_SESSION['token'],$_SESSION['secret']);
  $oauth->fetch("$api_url", $args);
  $json = json_decode($oauth->getLastResponse());
  print_r($json);

} catch(OAuthException $E) {
  print_r($E);
}

Сообщение, которое я получаю:

Warning: OAuth::fetch(http://api.rdio.com/1?oauth_consumer_key=vmu7x6u4rktv468vae8dn28h&oauth_signature_method=HMAC-SHA1&oauth_nonce=12606272174d85622ad26ce8.80381248&oauth_timestamp=1300587050&oauth_version=1.0&oauth_token=238zec5p4rpcpbfd8j36sjggz3jfsssybhxgcn9kvmmrmdxr3t4f2cnspt4dg5xf&oauth_signature=1mZhJ9AUbi0sm6qhNaAntumAckU%3D) [function.OAuth-fetch]: failed to open stream: HTTP request failed! HTTP/1.0 596

Проблема, скорее всего, в том, что аргументы (method = currentUser) не передаются через POST должным образом. У кого-нибудь есть идеи, как это сделать, используя расширения OAuth PECL?

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

В случае, если кто-то сталкивается с этим в поисках ответа, вот что я нашел работ:

Чтобы выполнить подписанный запрос POST OAuth, необходимо настроить объект OAuth для отправки с использованием POST вместо GETдобавление этого метода перед методом fetch():

$oauth->setAuthType(OAUTH_AUTH_TYPE_FORM); 

Даже если вы используете параметр OAUTH_HTTP_METHOD_POST в методе fetch(), сам экземпляр OAuth должен вызывать setAuthType(OAUTH_AUTH_TYPE_FORM)первый.

Код для конкретного примера, который я привел:

    if(!isset($_GET['oauth_token']) && $_SESSION['state']==1) $_SESSION['state'] = 0;

$oauth = new OAuth($rdio_conskey,$rdio_conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$oauth->enableDebug();
if(!isset($_GET['oauth_token']) && !$_SESSION['state']) {
  $request_token_info = $oauth->getRequestToken($rdio_req_url);
  $_SESSION['secret'] = $request_token_info['oauth_token_secret'];
  $_SESSION['state'] = 1;
  header('Location: '.$rdio_auth_url.'?oauth_token='.$request_token_info['oauth_token'].'&oauth_callback='.$callbackurl);
  exit;
} else if($_SESSION['state']==1) {
  $oauth->setToken($_GET['oauth_token'],$_SESSION['secret']);
  $access_token_info = $oauth->getAccessToken($rdio_acc_url);
  $_SESSION['state'] = 2;
  $_SESSION['token'] = $access_token_info['oauth_token'];
  $_SESSION['secret'] = $access_token_info['oauth_token_secret'];
}   

$oauth = new OAuth($rdio_conskey, $rdio_conssec, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);
$oauth->setToken($access_token_info['oauth_token'],$access_token_info['oauth_token_secret']);
$oauth->setAuthType(OAUTH_AUTH_TYPE_FORM);

$oauth->fetch($rdio_api_url, array("method" => "currentUser", "extras" => "username"), OAUTH_HTTP_METHOD_FORM);
$json = json_decode($oauth->getLastResponse());    

print_r($json);
0 голосов
/ 21 июля 2014

Использование OAUTH_AUTH_TYPE_FORM - это только обходной путь.

В версии 1.2.3 расширения oauth от Pecl есть ошибка ; getRequestToken и getAccessToken используют запросы GET вместо POST, как того требует RFC.

Вы можете обойти эту ошибку, передав OAUTH_HTTP_METHOD_POST в качестве 3-го параметра в getRequestToken и 4-го параметра в getAccessToken. Да, эти параметры не имеют документов .


Версия 1.2.4 pecl / oauth по умолчанию будет POST.

...