[英]Oauth 1.0 - Connection to an Api
我正在尝试与 API 建立连接,它将为我的网站提供有关汽车和其他东西的信息。 问题是我可以从 PostMan 连接它,因为它会生成签名和通知。 我遇到的问题是,当我想连接时抛出 PHP OAUTH class 没有生成 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);
谢谢
这是我向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);
我找到了解决方案。 问题是这里缺少一个参数:
$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);
感谢大家的帮助!
你可以使用另一个库,我建议你使用 GuzzleHttp。 要安装它,您可以使用 Composer。
{“要求”:{“guzzlehttp/guzzle”:“6.5”,“guzzlehttp/oauth-subscriber”:“^0.6.0”}}
对于实施,您可以像这样处理
使用 \GuzzleHttp\Client;
使用 \GuzzleHttp\HandlerStack;
使用 \GuzzleHttp\Subscriber\Oauth\Oauth1;
$stack = HandlerStack::create();
$middleware = new Oauth1(['consumer_key' => '','consumer_secret' => '','signature_method' => Oauth1::SIGNATURE_METHOD_HMAC]);
$stack->push($middleware);
$client = new Client(['base_uri' => '<BASE_URL>','handler' => $stack]);
$res = $client->get('<ROUTE_DATA>', ['auth' => 'oauth'])->getBody()->getContents();
$res = json_decode($res);
var_dump($res->title);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.