Oauth 1.0 - 连接到Api

时间:2017-06-16 14:27:29

标签: php api oauth

我正在尝试建立一个API,它将为我的网站提供有关汽车和其他内容的信息。问题是我可以从PostMan连接它,因为它会生成签名和nounce。 我遇到的问题是,当我想连接抛出PHP时,OAUTH类不会生成nounce和签名,所以我无法连接。 我也尝试过CURL,发生了更好的事情。

我目前的代码是:

$config = array(
    'consumer_key' => 'XXXXXXXXXXXXXXXXXXXXXXX',
    'consumer_secret' => 'XXXXXXXXXXXXXXXXXXXXXXX',
    'request_uri' => 'http://bdc.autobild.es/autobild'
);
$oauth = new OAuth($config['consumer_key'], 
$config['consumer_secret'], OAUTH_SIG_METHOD_HMACSHA1); 
$requestTokenInfo = $oauth->getRequestToken('http://bdc.autobild.es/autobild/','http://localhost/myfolder/');
d($requestTokenInfo);

$accessTokenInfo = $oauth->getAccessToken('http://bdc.autobild.es/autobild/');
d($accessTokenInfo);

$requestInfo = $oauth->getLastResponseInfo();
d($requestInfo);

$oauth->fetch("http://bdc.autobild.es/autobild/list?type=coche");
$data = $oauth->getLastResponseInfo();
d($data);

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是我对OAuth服务进行身份验证的方式,可能会有用:

<强> signin.php

//Gets the request token 
session_start();
$oauth = new OAuth($config['consumer_key'], $config['consumer_secret'], OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_FORM); 
$requestTokenInfo = $oauth->getRequestToken("<oauth token URL>", $_SERVER["SERVER_NAME"]."/callback.php");
$_SESSION["tokenInfo"] = $requestTokenInfo;
header("Location: <oauth authorize URL>?token='.$requestTokenInfo["oauth_token"]); //May vary on your OAuth service

callback.php

session_start();
$oauth = new OAuth($config['consumer_key'], $config['consumer_secret'], OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_FORM); 
$oauth->setToken($_REQUEST['oauth_token'], $_SESSION["tokenInfo"]["secret"]);
$accessTokenInfo = $oauth->getAccessToken("<oauth authorize URL>");
$_SESSION["accessToken"] = $accessTokenInfo;
unset($_SESSION["tokenInfo"]); //Its work is done

现在每当我需要获取一些API数据时:

session_start();
$oauth = new OAuth($config["consumer_key"], $config["consumer_secret"], OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI); 
$oauth->setToken($_SESSION["accessToken"]["token"],$_SESSION["accessToken"]["secret"]);

$oauth->fetch("URL");
$data = $oauth->getLastResponse();
$requestInfo = $oauth->getLastResponseInfo();
$responseHeaders = $oauth->getLastResponseHeaders();

这将适用于您需要代表用户执行请求的情况。用户将被重定向到服务的oauth autorizer,然后如果他们授权您的应用,则会返回带有令牌的回调页面。

如果该服务提供了一些可以直接从您的应用程序访问的方法(通常将应用程序使用信息等与这些相关联),那么您可以跳过很大一部分:

$oauth = new OAuth($config['consumer_key'], $config['consumer_secret'], OAUTH_SIG_METHOD_HMACSHA1); 

$oauth->fetch(url); 

答案 1 :(得分:1)

我找到了解决方案。问题是这里缺少一个论点:

$oauth = new OAuth($config['consumer_key'], $config['consumer_secret'], OAUTH_SIG_METHOD_HMACSHA1); 

正确的方法是:

$oauth = new OAuth($config['consumer_key'], $config['consumer_secret'], OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI); 

所以,完整的代码是这样的:

    $config = array(
        'consumer_key' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
        'consumer_secret' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
    );

    $oauth = new OAuth($config['consumer_key'], $config['consumer_secret'], OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_URI);    

    $requestInfo = $oauth->getLastResponseInfo();

    $oauth->fetch("http://example.es/list?type=car");
    $data = $oauth->getLastResponse();
    var_dump($data);

感谢大家的帮助!