繁体   English   中英

如何使用PHP / cURL对Discogs API的POST进行身份验证

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM