OAUTH使用PHP的PECL OAUTH - 使用方法getRequestToken()时不能使用POST?

时间:2010-11-11 12:03:00

标签: php oauth pecl

我在尝试对API进行身份验证时使用PECL OAuth。

示例代码:

<?php

$requestUri = 'http://openapi.lovefilm.com/oauth/request';

$consumerKey = 'MYCONSUMERKEY'; 
$consumerSecret = 'MYSECRET';

$oauth = new OAuth($consumerKey, $consumerSecret);

$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauth->setVersion('1.0');
$oauth->setTimestamp(mktime());


$oauth->enableDebug();

try
{
    $req = $oauth->getRequestToken($requestUri, 'oob');
    var_dump($req);
}
catch(OAuthException $e)
{
    print '<pre>';
    var_dump($e);

    var_dump($oauth->debugInfo);
}

?>

他们提供的规范(http://developer.lovefilm.com/-registration req)说我应该发布类似下面的请求:

    POST / oauth / request_token HTTP / 1.1     主持人:openapi.lovefilm.com     授权:OAuth         oauth_callback = “HTTP%3A%2F%2Fyour-service.com%2Fsuccess”,         oauth_consumer_key = “2blu7svnhwkzw29zg7cwkydn”,         oauth_nonce = “5f38dbc02a97567965f14d”,         oauth_signature = “sPSVmqN%2FXu9k0wlZxF0PqPZwYGo%3D”,         oauth_signature_method = “HMAC-SHA1”,         oauth_timestamp = “1278499295”,         oauth_version = “1.0”

但是当我使用方法时:

$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION);

生成的请求始终是GET。

有人可以帮忙吗?

谢谢,

4 个答案:

答案 0 :(得分:2)

是的,根据OAuth Specificationthe request for Temporary Credentials (AKA "Request Token")the request for Token Credentials (AKA "Access Token")必须作为HTTP POST请求提交,但PECL OAuth扩展似乎会持续使用{{1默认为GETgetRequestToken() ...

an $auth_type parameter to OAuth::__construct()接受one of the following values

  • getAccessToken() - 在请求的HTTP OAUTH_AUTH_TYPE_AUTHORIZATION标头中提交OAuth参数(默认使用Authorization请求)。
  • GET - 在请求URI中提交OAuth参数(即OAUTH_AUTH_TYPE_URI请求中的查询参数)。
  • GET - 提交OAuth参数作为HTTP POST正文的一部分(在OAUTH_AUTH_TYPE_FORM请求中)。
  • POST - 根本不提交OAuth参数,即“NoAuth”请求(默认情况下也为OAUTH_AUTH_TYPE_NONE)。

根据我的经验,GETfetch()getRequestToken()方法都尊重此设置,which can also be set with OAuth::setAuthType()对象的实例。实际上,我在执行舞蹈时将身份验证类型设置为getAccessToken(),然后重置为默认值 - OAUTH_AUTH_TYPE_FORM - 以进行资源请求。

答案 1 :(得分:0)

当你给出的例子中的帖子正文中没有任何内容时,他们专门询问POST有点奇怪!当它是GET请求时它是否有效?我很想接受他们的技术支持,并询问那里发生了什么。如果需要POST,您可能需要手动组装请求而不是使用PECL,这很可能,但非常繁琐。

答案 2 :(得分:0)

解决此问题的一种方法是使用OAuth::fetch代替OAuth::getRequestTokenOAuth::getAccessToken

$oauth = new OAuth('consumer_key', 'consumer_secret');
$oauth->fetch(
    'https://example.com/oauth/request_token', 
    array(), 
    OAUTH_HTTP_METHOD_POST
);
parse_str($oauth->getLastResponse(), $token_pair);

答案 3 :(得分:0)

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

Pecl的oauth扩展版本1.2.3有a bug; getRequestTokengetAccessToken使用GET请求而不是RFC所需的POST。

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


pecl / oauth版本1.2.4将默认为POST。