Přesměrování na stejnou stránku pro přihlášení pomocí komponenty
- Klainer
- Člen | 42
Dobrý den,
řeším menší problém, který tu pravděpodobně mělo již více lidí,
nicméně se mi nedaří ho vyřešit.
Využívám komponentu pro login pomocí LinkedIn api, knihovna je ZDE.
Snažím se uživatele po přihlášení opět přesměrovat na tu samou stránku kde se původně nacházel.
Jaký je nejlepší způsob jak dosáhnou požadované funkčnosti ? Děkuji za rady !
Můj kod v presenteru vypadá následovně:
protected function createComponentLinkedinLogin()
{
$dialog = $this->linkedin->createDialog($this->storeRequest());
/** @var \Fabian\Linkedin\LoginDialog $dialog */
$dialog->onResponse[] = function(\Fabian\Linkedin\LoginDialog $dialog) {
try {
/**
* Variable $me contains all the public information about the user
* including linkedIn id, name and email, if he allowed you to see it.
*/
$me = $this->linkedin->call(
'people/~:(id,first-name,last-name,headline,picture-url,email-address)'
);
// Try to find if user is existing, otherwise save new user
if(!$existing = $this->users->getDao()->findOneByLinkedInId($me->id))
{
$existing = new \App\Entity\User();
$existing->username = $me->emailAddress;
$existing->role = 'visitor';
$existing->password = 'stsrřetk';
$existing->linkedInId = $me->id;
$this->users->save( $existing );
}
/**
* You should save the access token to database for later usage.
*
* You will need it when you'll want to call LinkedIn API,
* when the user is not logged in to your website,
* with the access token in his session.
*/
$session = $this->getSession('linkedin');
$this->users->updateLinkedInAccessToken($me->id, $session->access_token);
/**
* Nette\Security\User accepts not only textual credentials,
* but even an identity instance!
*/
$this->user->login(new \Nette\Security\Identity($existing->linkedInId, $existing->role,
array(
'username'=>$existing->username ,
'role'=>$existing->role ,
//'password'=>$existing->password ,
'linkedInId'=>$existing->linkedInId ,
'token'=>$existing->authKey ,
)
));
} catch (Exception $e) {
/**
* You might wanna know what happened, so let's log the exception.
*
* Rendering entire bluescreen is kind of slow task,
* so might wanna log only $e->getMessage(), it's up to you
*/
\Nette\Diagnostics\Debugger::log($e, 'linkedIn');
$this->flashMessage("Sorry bro, LinkedIn authentication failed hard.");
}
};
return $dialog;
}
Kod volané komponenty:
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)
{
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()
{
$url = $this->linkedin->getRedirectUrl($this->link('//response!'));
$this->presenter->redirectUrl($url);
}
public function handleResponse()
{
$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!')
);
$this->onResponse($this);
$this->presenter->redirect('this');
}
}
V šabloně pak volám komponentu takto:
<a n:href="linkedinLogin-open! "></a>
Napadla mě ještě jedna věc v API linkeIn je nutné nsatvit url na které
se stránka přesměruje pro úspěšném přihlášení, co jsem si tak četl
umožňuje rovněž přidávat nepovinné parametry např ?url=xx ,
pokud by to tak fungovalo stačilo by si jen přenastavit nastavení routingu
aby umožňoval tyto nepoviiné parametry příjmat.
Má routa na detail vypadá následovně, přidaljsem tam routu s OneWay, kde se snažím dosáhnout toho, že my url sebere i např tohle: Http://www.xxxx.cz/nabidka-prace?url=1 zatím mi to ovšem nefunguje. Jak korektně nastavím routy aby tohle fungovalo ? Děkuji
// Offer - detail
$router[] = new Route('[<locale (' . implode('|', $locales) . ')>/]nabidky-prace/<url [0-9]*>',
array(
'module' => 'Front',
'presenter' => 'Offer',
'action' => 'detail',
'url' => array(Route::FILTER_OUT => function ($url) {
return $url;
}, Route::VALUE => null
), Route::ONE_WAY
));
$router[] = new Route('[<locale (' . implode('|', $locales) . ')>/]nabidky-prace/<url [a-z0-9\/-]*>',
array(
'module' => 'Front',
'presenter' => 'Offer',
'action' => 'detail',
'url' => array(Route::FILTER_OUT => function ($url) {
return $url;
}, Route::VALUE => null
)
));
Editoval Klainer (4. 8. 2014 17:24)
- Klainer
- Člen | 42
Děkuji, Ok, jak si mám ale uložit aktuální url na které se to má
přesměrovat.
Komponenetu volám zde: http://127.0.0.1:8099/…etni-nabidky a vrací se mi to zde:
http://127.0.0.1:8099/…abidky-prace
V rámci toku událostí, kdy a kde a jak je nejlepší si uložit URL kam se
vracet, abych přesměrování pak mohl v události OnResponse korektně
přesměrovat ?
Děkuji
Editoval Klainer (4. 8. 2014 16:11)
- Klainer
- Člen | 42
Ok super vyřešil jsem to tak, že jsem si u tlačítka s loginem dal nepovinný parametr s ID dané nabídky, následně po přesměrování na linkedIn api a přihlášení se mi tento nepovinný parametr zachová, následně přesměruji přesně jak píšeš. Na daný presenter s pomocí backlink.
Děkuji všem za rady