我在尝试对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。
有人可以帮忙吗?
谢谢,
本
答案 0 :(得分:2)
是的,根据OAuth Specification,the request for Temporary Credentials (AKA "Request Token")和the request for Token Credentials (AKA "Access Token")必须作为HTTP POST
请求提交,但PECL OAuth扩展似乎会持续使用{{1默认为GET
和getRequestToken()
...
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
)。根据我的经验,GET
,fetch()
和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::getRequestToken
和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);
答案 3 :(得分:0)
使用OAUTH_AUTH_TYPE_FORM
只是一种解决方法。
Pecl的oauth扩展版本1.2.3有a bug; getRequestToken
和getAccessToken
使用GET请求而不是RFC所需的POST。
您可以将OAUTH_HTTP_METHOD_POST
作为第三个参数传递给getRequestToken
,将第四个参数传递给getAccessToken
,以解决此错误。是的,那些参数are undocumented。
pecl / oauth版本1.2.4将默认为POST。