使用PHP/PECL OAuth扩展通过POST传递参数

3
我对OAuth的概念还比较新,我正在尝试与新的Rdio API进行交互。我已经成功使用PECL OAuth函数进行了身份验证,但是Rdio要求通过POST传递参数,我无法弄清楚如何实现。身份验证有效:用户被反弹到Rdio网站并被要求批准应用程序,然后他们被返回到该网站。然而,在那之后,调用API的请求失败了。
这里有一些关于Rdio API的信息:http://developer.rdio.com/docs/REST/ 这是我的身份验证代码...斜体字行应该是我认为可以调用名为“currentUser”的方法的API请求。
$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);
}

我收到的消息:

警告: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]:无法打开流:HTTP请求失败! HTTP / 1.0 596

问题很可能是参数(method = currentUser)未正确通过POST传递。 有人知道如何使用PECL的OAuth扩展来解决这个问题吗?


$callback = 'http://localhost/test.php'; 这不应该是 $callback = 'http://conectablehost.com/test.php'; 吗? - Lawrence Cherone
是的,我只是更改了主机以从我的代码中获取具体信息。就像我在顶部使用虚假密钥和秘密密钥一样。 - ams
2个回答

2

如果有人在寻找答案,请看这里,以下是我发现可行的解决方案:

要执行一个带 OAuth 签名的 POST 请求,你需要在 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);

1
您还可以将授权类型设置为OAUTH_AUTH_TYPE_AUTHORIZATION(默认值),以将参数编码到HTTPAuthorization标头中。在我的看法中,这样的请求更加清晰易懂。 - AL the X

0

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

Pecl的oauth扩展版本1.2.3存在一个错误; getRequestTokengetAccessToken使用GET请求而不是RFC所需的POST。

您可以通过将OAUTH_HTTP_METHOD_POST作为第三个参数传递给getRequestToken和第四个参数传递给getAccessToken来解决此错误。是的,这些参数未记录在文档中


pecl/oauth 的版本 1.2.4 将默认使用 POST 方法。


你好,我该如何在GoDaddy VPS服务器上安装OAuth?我搜索了很多但没有找到解决方案,你能帮助我吗? - Gem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接