6

我在尝试对 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="5f38dbc02a97567965f14dsign," “sPSVmqN%2FXu9k0wlZxF0PqPZwYGo%3D”,oauth_signature_method="HMAC-SHA1",oauth_timestamp="1278499295",oa​​uth_version="1.0"

但是,当我使用该方法时:

$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION);

生成的请求始终是 GET。

任何人都可以帮忙吗?

谢谢,

4

4 回答 4

2

是的,根据OAuth 规范对临时凭证(AKA“请求令牌”)的请求和对令牌凭证(又名“访问令牌”)的请求必须作为 HTTPPOST请求提交,但 PECL OAuth 扩展似乎一直使用GETgetRequestToken()...getAccessToken()默认情况下。

一个$auth_type参数OAuth::__construct()接受以下值之一

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

根据我的经验,fetch()getRequestToken()getAccessToken()方法都尊重这个设置,也可以OAuth::setAuthType()在对象的实例上设置。在实践中,我在执行舞蹈时将 auth 类型设置为OAUTH_AUTH_TYPE_FORM,然后重置为默认值 -- OAUTH_AUTH_TYPE_AUTHORIZATION-- 以进行资源请求。

于 2013-04-04T21:34:10.523 回答
0

解决此问题的一种方法是使用OAuth::fetch代替OAuth::getRequestTokenand OAuth::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);
于 2013-05-06T14:21:58.747 回答
0

当您给出的示例中的帖子正文中没有任何内容时,他们专门要求 POST 有点奇怪!当它是一个 GET 请求时它工作吗?我很想 ping 他们的技术支持并询问那里发生了什么。如果需要 POST,您可能必须手动组装请求,而不是使用 PECL,这很有可能,但非常乏味。

于 2010-11-11T12:34:00.927 回答
0

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

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

您可以通过将OAUTH_HTTP_METHOD_POST第三个参数传递给getRequestToken并将第四个参数传递给getAccessToken. 是的,这些参数是未记录的


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

于 2014-07-21T09:41:22.867 回答