[英]How do I authenticate a POST to the Discogs API with PHP / cURL
我已成功使用此示例https://gist.github.com/tonefolder/44191a29454f9059c7e6來驗證用戶並存儲oauth_token和oauth_token_secret。 然后,我可以使用cURL進行經過身份驗證的GET請求。
我不知道如何進行經過身份驗證的POST請求。
我嘗試以這種方式使用簽名的oauthObject中的$ result ['header']:
$discogs_username = "'XXXX'";
$result = mysql_query("SELECT * FROM discogs WHERE username = $discogs_username;", $link);
if (mysql_num_rows($result)) {
$discogs_details = mysql_fetch_array($result, MYSQL_ASSOC);
}
$signatures = array(
'consumer_key' => 'MyKey',
'shared_secret' => 'MySecret',
'oauth_token' => $discogs_details['oauth_token'],
'oauth_token_secret' => $discogs_details['oauth_token_secret']
);
$jsonquery = json_encode(array(
'release_id' => '7608939',
'price' => '18.00',
'condition' => 'Mint',
'sleeve_condition' => 'Mint',
'status' => 'For Sale'
)
);
$result = $oauthObject->sign(array(
'path' => $scope.'/marketplace/listings',
'signatures'=> $signatures
)
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, 'MyDiscogsClient/0.1 +http://me.com');
curl_setopt($ch, CURLOPT_URL, $result['signed_url']);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Authorization:' . $result['header']));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonquery);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = json_decode(curl_exec($ch), true);
curl_close($ch);
但我得到'[message] =>您必須進行身份驗證才能訪問此資源。
我不確定我是否正確地進行了CURLOPT_POSTFIELDS部分,但是一旦我真的能夠發送經過身份驗證的POST,我就可以解決這個問題! 對不起,如果還有更多的錯誤 - 我不經常使用cURL!
背景
在復制了所有步驟並擺弄了一下后,我發現了以下內容。 作為一個副節點,我假設$scope
變量只包含API url,即https://api.discogs.com
。
事實證明,簽署OAuth請求還需要知道您將要使用的正確請求方法。 你可以通過var_dump()
找到你從sign()
調用獲得的$result
:
array(5) {
/// ... snip ...
'sbs' =>
string(269) "GET&https%3A%2F%2Fapi.discogs.com%2Fmarketplace%2Flistings&oauth_consumer_key%XXXXX%26oauth_nonce%3DMOtWK%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1453937109%26oauth_token%XXXXX%26oauth_version%3D1.0"
}
所以我在你正在使用的“OAuthSimple”庫的代碼中挖掘了一下,事實證明你可以在名為“action”的索引下傳遞該方法。
解
根據調查結果,您將不得不改變這一點:
$result = $oauthObject->sign(
array(
'path' => $scope . '/marketplace/listings',
'signatures' => $signatures,
)
);
對此:
$result = $oauthObject->sign(
array(
'path' => $scope . '/marketplace/listings',
'signatures' => $signatures,
'action' => 'POST',
)
);
旁注
我實際上嘗試了該解決方案,並能夠通過API創建列表。 我必須做的唯一其他更改是條件和sleeve_condition值,它們的API不允許Mint
,因此您實際上必須使用Mint (M)
。
此外,我最初得到一個錯誤,說我必須完成我的“賣家設置”。 所以你可能想在你的應用程序中捕獲這種情況。
進一步的想法
正如您在原始帖子的評論中提到的那樣,您認為建議的庫也允許GET請求。 但是,正如你在這里看到的那樣 ,它只返回一個Guzzle客戶端 ,所以通過它發送POST請求根本不應該是一個問題,實際使用它可能會為你節省很多痛苦。 然而,我沒有嘗試過,所以,就像想到的那樣。
希望有幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.