如何使用PHP / cURL对Discogs API的POST进行身份验证
我已成功使用此处的示例
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” library的代码,事实证明你可以在一个名为“action”的索引下传递该方法. 解 根据调查结果,您将不得不改变这一点: $result = $oauthObject->sign( array( 'path' => $scope . '/marketplace/listings','signatures' => $signatures,) ); 对此: $result = $oauthObject->sign( array( 'path' => $scope . '/marketplace/listings','action' => 'POST',) ); 旁注 我实际上尝试了该解决方案,并能够通过API创建列表.我必须做的唯一其他更改是条件和sleeve_condition值,它们的API不允许Mint,因此您实际上必须使用Mint(M). 此外,我最初得到一个错误,说我必须完成我的“卖家设置”.所以你可能想在你的应用程序中捕获这种情况. 进一步的想法 正如您在原始帖子的评论中提到的那样,您认为suggested library也允许GET请求.但是,作为you can see here,它只返回一个Guzzle Client,所以通过这个触发POST请求根本不应该是一个问题,实际使用它可能会为你节省很多痛苦.然而,我没有尝试过,所以,就像想到的那样. 希望有帮助:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |