2010-11-11 90 views
5

我在嘗試向API進行身份驗證時使用PECL OAuth。使用PHP的PECL OAUTH的OAUTH - 使用方法getRequestToken()時不能使用POST?

示例代碼:

<?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/ - 登記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」, 非統組織th_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。

任何人都可以幫忙嗎?

感謝,

回答

2

是,根據OAuth Specificationthe request for Temporary Credentials (AKA "Request Token")the request for Token Credentials (AKA "Access Token")必須提交作爲HTTP POST請求,但是PECL擴展的OAuth似乎堅持用GETgetRequestToken()getAccessToken() ...默認。

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

  • OAUTH_AUTH_TYPE_AUTHORIZATION - 提交的OAuth參數在請求的HTTP標頭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()方法都尊重這個設置,which can also be set with OAuth::setAuthType()對對象的實例。實際上,我在執行舞蹈時將auth類型設置爲OAUTH_AUTH_TYPE_FORM,然後重置爲默認值 - OAUTH_AUTH_TYPE_AUTHORIZATION - 以發出資源請求。

0

這是一個有點奇怪,他們對POST專門詢問時,有沒有在帖子正文中,你給的例子!當它是GET請求時它工作嗎?我很想平息他們的技術支持,並詢問那裏發生了什麼。如果需要POST,您可能需要手動組裝請求,而不是使用PECL,這很可能但非常繁瑣。

+0

我查找了SPEC: – 2010-11-11 12:52:44

+0

'服務提供者文檔指定了此請求的HTTP方法,並且HTTP POST是推薦的。 ' – 2010-11-11 12:53:53

+0

^^從Oauth規範請求令牌。 (在側面注意,當在此框中輸入時,它似乎按'返回'提交)。多煩人! – 2010-11-11 12:54:50

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

使用OAUTH_AUTH_TYPE_FORM只是一種解決方法。

pecl的oauth擴展版本1.2.3有a bug; getRequestTokengetAccessToken使用GET請求代替POST,因爲RFC需要。

您可以通過將OAUTH_HTTP_METHOD_POST作爲第3個參數傳遞給getRequestToken並將第4個參數傳遞給getAccessToken來解決此問題。是的,那些參數are undocumented


pecl/oauth的版本1.2.4將默認爲POST。