【问题标题】:Passing arguments via POST with PHP/PECL OAuth extension通过带有 PHP/PECL OAuth 扩展的 POST 传递参数
【发布时间】:2011-03-20 02:35:55
【问题描述】:

我对 OAuth 的概念还很陌生,我正在尝试与新的 Rdio API 进行交互。我已经设法使用 PECL OAuth 函数找出身份验证,但 Rdio 需要通过 POST 传入参数,我无法弄清楚这是如何完成的。身份验证有效:用户被退回到 Rdio 的站点并被要求批准该应用程序,然后他们被返回到该站点。但是,在那之后,调用 API 的请求会失败。

这里有一些关于 Rdio API 的信息: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 正确传递。有谁知道如何使用 PECL 的 OAuth 扩展来做到这一点?

【问题讨论】:

标签: php oauth pecl


【解决方案1】:

如果有人在寻找答案时遇到此问题,以下是我发现的有效方法:

要执行 POST OAuth 签名请求,您需要通过在 fetch() 方法之前添加此方法,将 OAuth 对象设置为使用 POST 而不是 GET 发送:

$oauth->setAuthType(OAUTH_AUTH_TYPE_FORM); 

即使您在fetch() 方法中使用OAUTH_HTTP_METHOD_POST 参数,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);

【讨论】:

  • 您也可以将认证类型设置为OAUTH_AUTH_TYPE_AUTHORIZATION(默认),以将参数编码到HTTP Authorization 标头中。更清晰的调试请求,IMO。
【解决方案2】:

使用OAUTH_AUTH_TYPE_FORM 只是一种解决方法。

Pecl 的 oauth 扩展版本 1.2.3 有a buggetRequestTokengetAccessToken 按照 RFC 的要求使用 GET 请求而不是 POST。

您可以通过将OAUTH_HTTP_METHOD_POST 作为第三个参数传递给getRequestToken 并将第四个参数传递给getAccessToken 来解决此错误。是的,那些参数are undocumented


pecl/oauth 1.2.4 版将默认为 POST。

【讨论】:

  • 您好,如何在 GoDaddy VPS 服务器中安装 OAuth?我搜索了很多,但没有解决方案,你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2017-10-12
相关资源
最近更新 更多