gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:17:33 25 4
gpt4 key购买 nike

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

问题很可能是参数 (method=currentUser) 没有通过 POST 正确传递。有谁知道如何使用 PECL 的 OAuth 扩展来做到这一点?

最佳答案

万一有人在寻找答案时遇到这个问题,这里是我发现的有效方法:

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

$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);

关于php - 使用 PHP/PECL OAuth 扩展通过 POST 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5366408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com