带有Magento 1.9的oAuth 1.0 REST API,如何像邮递员一样获得oauth_signature?

时间:2018-06-22 18:34:51

标签: php magento oauth postman

我正在尝试使用php访问Magento 1.9 REST API,该API仅在oAuth 1.0中支持身份验证。

现在,我让它在Postman中工作,但是它正在做某种不可告人的oAuth魔术。它甚至还有一个用于请求代码的按钮,但是随机数,时间和签名必须随每个请求而改变。

我正在使用消费者密钥,消费者密钥,访问令牌和访问密钥对example.com/api/rest/products(生产站点,为保护隐私而更改了网址)进行GET请求。它对所有产品都返回正确的响应。这是它输出的curl代码...

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://www.example.com/api/rest/products",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Authorization: OAuth oauth_consumer_key=\"some_key\",oauth_token=\"some_token\",oauth_signature_method=\"HMAC-SHA1\",oauth_timestamp=\"1529691153\",oauth_nonce=\"0fVylxHPUqv\",oauth_version=\"1.0\",oauth_signature=\"LTJHEp2A5mczD3xrYxbWW2BHlQk%3D\"",
    "Cache-Control: no-cache",
    "Content-Type: application/json",
    "Postman-Token: d684d11c-498e-4760-8709-76777e8ea75d"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

这不起作用,由于已使用随机数,每次都会失败。如果我更改随机数,则表明签名无效。

这是Magento的古代文档推荐的代码,失败时显示403未经授权。

$baseUrl = 'https://www.example.com';
$callbackUrl = 'http://otherexample.test/test';
$temporaryCredentialsRequestUrl = $baseUrl."/oauth/initiate?oauth_callback=" . urlencode($callbackUrl);
$adminAuthorizationUrl = $baseUrl.'/admin/oauth_authorize';
$accessTokenRequestUrl = $baseUrl.'/oauth/token';
$apiUrl = $baseUrl.'/api/rest';

$consumerKey = 'some_key';
$consumerSecret = 'some_secret';

session_start();

if(! isset($_SESSION['state'])) {
    $_SESSION['state'] = null;
}

if (!isset($_GET['oauth_token']) && isset($_SESSION['state']) && $_SESSION['state'] == 1) {
    $_SESSION['state'] = 0;
}

try {
    $authType = ($_SESSION['state'] == 2) ? OAUTH_AUTH_TYPE_AUTHORIZATION : OAUTH_AUTH_TYPE_URI;
    $oauthClient = new \OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, $authType);
    $oauthClient->enableDebug();

    if (!isset($_GET['oauth_token']) && !$_SESSION['state']) {
        $requestToken = $oauthClient->getRequestToken($temporaryCredentialsRequestUrl);
        $_SESSION['secret'] = $requestToken['oauth_token_secret'];
        $_SESSION['state'] = 1;
        header('Location: ' . $adminAuthorizationUrl . '?oauth_token=' . $requestToken['oauth_token']);
        exit;
    } else if ($_SESSION['state'] == 1) {
        $oauthClient->setToken($_GET['oauth_token'], $_SESSION['secret']);
        $accessToken = $oauthClient->getAccessToken($accessTokenRequestUrl);
        $_SESSION['state'] = 2;
        $_SESSION['token'] = $accessToken['oauth_token'];
        $_SESSION['secret'] = $accessToken['oauth_token_secret'];
        header('Location: ' . $callbackUrl);
        exit;
    } else {
        $oauthClient->setToken($_SESSION['token'], $_SESSION['secret']);

        $resourceUrl = $apiUrl . "/products";

        $oauthClient->fetch($resourceUrl, array(), 'GET', array('Content-Type' => 'application/json'));
        $productsList = json_decode($oauthClient->getLastResponse());
        print_r($productsList);
    }

} catch (\OAuthException $e) {
    print_r($e->getMessage());
    echo "&lt;br/&gt;";
    print_r($e->lastResponse);
}

基本上,我认为我需要像邮递员一样以某种方式生成现时和签名。我要给邮递员提供我的访问令牌和机密,但这当然不在响应中,因为机密永远都不应该。那怎么做呢?每次我在邮递员中运行请求时,请求都会成功,并且代码示例中包含不同的数据。每次我在php中运行它时都会失败,并且没有得到授权。

我更喜欢使用像Guzzle这样的面向对象的东西,而不是curl,但是我将尽一切所能使这个外部站点能够使用Magento 1.x REST API。

Here is what is working in postman, with the keys removed.

1 个答案:

答案 0 :(得分:0)

是的,您必须为每个发送的请求生成一个随机随机数。

let nonceObj = Math.random()
  .toString(36)
  .replace(/[^a-z]/, "")
  .substr(2);

这就是我在JS中所做的事情。