Nette extension propojení s LinkedIn API
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Klainer
- Člen | 42
Dobrý den,
trošku tápám, snažím se vytvořit extension na propojení s LinkedIn API,
jako základ jsem použil dostupný plugin na registraci pomocí Linked In viz
Zde GIT
Upravil jsem si dialog aby mi dal přístup do api linked, uživatel je přesměrován na api linked in, zadá své přihlašovací udaje a souhlas s využívaní této aplikace, neásledně je přesměrován zpět na web. Zde bych si chtěl ze zpětného přesměrování uložt pár informací, abych se pak mohl dotazovat na API.
Při přesměrování mi to ale vyhodí následující chybku:
Missing argument 1 for Fabian\Linkedin\Linkedin::getAccessToken(), called in C:\wamp\www\XXXX\vendor\nette\utils\src\Utils\ObjectMixin.php on line 140 and defined search►
Nevíte čím může být chyba způsobena a jak ji opravit? Děkuji.
Zdroj. kody
Komponeneta vypadá následovně:
Továrnička v BasePresenteru:
protected function createComponentLinkedinLogin()
{
$dialog = $this->linkedin->createDialog();
/** @var \Fabian\Linkedin\LoginDialog $dialog */
$dialog->onResponse[] = function(\Fabian\Linkedin\LoginDialog $dialog) {
\Nette\Diagnostics\Debugger::barDump("ahoj");
};
return $dialog;
}
LinkedIn.php metoda:
public function getAccessToken($code, $redirectUri)
{
if (isset($this->accessToken)) {
return $this->accessToken;
}
\Nette\Diagnostics\Debugger::barDump("test");
$params = array(
'grant_type' => 'authorization_code',
'client_id' => $this->config->appId,
'client_secret' => $this->config->appSecret,
'code' => $code,
'redirect_uri' => $redirectUri,
);
$ch = curl_init($this->config->url['accessToken']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
$response = curl_exec($ch);
curl_close($ch);
$token = json_decode($response);
if (isset($token->error)) {
throw new Exception($token->error_description);
} elseif (!$token) {
throw new Exception('token error');
}
$this->session->access_token = $token->access_token;
\Nette\Diagnostics\Debugger::barDump($this->session->access_token);
return $token->access_token;
}
Dialog:
<?php
namespace Fabian\Linkedin;
/**
* @method onResponse(\Fabian\Linkedin\LinkedinLoginDialog $dialog)
*/
class LoginDialog extends \Nette\Application\UI\PresenterComponent
{
/**
* @var \Fabian\Linkedin\Linkedin
*/
protected $linkedin;
/**
* @var array of function(\Fabian\Linkedin\LoginDialog $dialog)
*/
public $onResponse = array();
public function __construct(\Fabian\Linkedin\Linkedin $linkedin = null)
{
parent::__construct();
$this->linkedin = $linkedin;
}
public function handleOpen()
{
if (!$this->presenter->user->isLoggedIn()) {
$this->open();
}
$this->onResponse($this);
$this->presenter->redirect('this');
}
private function open()
{
# Now we retrieve a request token. It will be set as $linkedin->request_token
$this->linkedin->getRequestToken();
// $container je systémový kontejner
$session = $this->getPresenter()->getSession('linkedin');
$session->requestToken = serialize($this->linkedin->request_token);
$url = $this->linkedin->getRedirectUrl($this->link('//response!'));
$this->presenter->redirectUrl($url);
}
public function handleResponse()
{
\Nette\Diagnostics\Debugger::barDump($this->presenter->params);
$params = $this->presenter->params;
if (!isset($params['code'])) {
throw new Exception('no code!');
}
// check state token for CSRF attack
if ($params['state'] != $this->linkedin->getState()) {
throw new Exception('CSRF attack!');
}
$accessToken = $this->linkedin->getAccessToken(
$params['code'], $this->link('//response!')
);
}
}