繁体   English   中英

Oauth 1.0 - 连接到 Api

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

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