Ujasnění REST API + auth v Nette
- Carson
- Člen | 35
Ahoj,
prolezl jsem si celé nette forum, kde byl tag REST, API a auth. Bohužel se mi nepodařilo najít to co potřebuji a proto se vás zeptám rovnou. Máte někdo zkušenost s tvorbou api v Nette? Řeším tu teď největší problém a to je autorizace aplikace a nevím jak na to. Jedná se mi hlavně o routování požadavků, které se budou na api posílat.
- CZechBoY
- Člen | 3608
Tak to zalezi na tobe. Vetsinou se posila pristupovy api klic v url
s kazdym pozadavkem. Kazdemu klientovi se vygeneruje 1 unikatni klic, ale
muzes mit klidne vic klicu…
Takze tim klicem prihlasis uzivatele a pak uz je to stejny jak u obycejny web
aplikace pres prohlizec. Zpracujes pozadavek a odpovis ve formatu, kteremu
klient rozumi – vetsinou json.
- Carson
- Člen | 35
CZechBoY napsal(a):
Tak to zalezi na tobe. Vetsinou se posila pristupovy api klic v url s kazdym pozadavkem. Kazdemu klientovi se vygeneruje 1 unikatni klic, ale muzes mit klidne vic klicu…
Takze tim klicem prihlasis uzivatele a pak uz je to stejny jak u obycejny web aplikace pres prohlizec. Zpracujes pozadavek a odpovis ve formatu, kteremu klient rozumi – vetsinou json.
Ano, principielně je mi způsob přihlašování známý, ale jak řešit expiraci tokenu? Popřípadě unikátnost v daném časovém intrvalu? Musím teď řešit mobilní aplikaci a bojím se odposlechnutí provozu a následného zneužití api… Zamlouval by se mi přístup přihlašování takový, že vygeneruji token pro klienta, ten ho pošle v session v headru a já ho zvaliduji. Problém nastává u té validace tokenu.
- srigi
- Nette Blogger | 558
Ja som pouzil REST router od new_pope. Authentizaciu som chcel vyriesit pomocou JWT (je tu na to aj niekde extension), ale napokon som sa na to vykaslal.
Takto – v istom momente budes chciet pristupovat v presenteroch API k
$this->user
. A zacne ta stvat, ze nie je ziadna dalsia
implementacia user-storage, ktora pouziva tieto vsieliake tokeny a headre. Takze
co urobis? Proste aj na API pouzijes cookie PHPSESSID a proste to neriesis.
Cookie je aj tak iba header.
Editoval srigi (10. 10. 2016 19:40)
- Tharos
- Člen | 1030
U autentizace a autorizace obzvláště platí, že vymýšlet vlastní mechanismy bývá kontraproduktivní (dá to fůru práce a výsledek nebývá úplně bezpečný).
Routování
V podstatě jde hlavně o to obohatit routování o práci s HTTP metodou…
Autentizace
Tady je průmyslovým standardem OAuth, který implementuje velké množství knihoven (server i klienta). V podstatě si stačí jen vybrat… Integrace vyžaduje typicky nějakou storage a něco málo routování (je zapotřebí poskytnout endpointy, které OAuth specifikuje).
Autorizace
Autorizace v Nette (ta inspirovaná Zendem) je velmi dobře použitelná.
Pokud budeš používat OAuth, tak na základě tokenu budeš vždy vědět, kdo
se s tvou aplikací baví. Není problém podle tokenu vždy někde při
inicializaci aplikace vytáhnout z úložiště správnou identitu a pak už
lze používat všechny vychytávky z Nette\Security\User
.
Dále se ti možná bude hodit nějaké inteligentní udělátko pro skládání response…
Editoval Tharos (10. 10. 2016 21:55)
- Carson
- Člen | 35
no, aktuálně řeším odeslání dat pomocí
public function sendJson($array)
{
return $this->sendResponse(new JsonResponse($array, "application/json;charset=utf-8"));
}
auth užvatele používám parametry, které mi pošle v klient body a pak ho buď pustím a nebo ne.
$response = file_get_contents('php://input');
$response = json_decode($response);
if (!empty($response->auth_pass) || !empty($response->auth_user)) {
if ($response->auth_pass != 'test' || $response->auth_pass != 'test') {
$this->sendJson(array(
'code' => 403,
'message' => 'unauthorized'
));
}
} else {
echo json_encode(array(
'code' => 403,
'message' => 'unauthorized'
));
die;
$this->sendJson(array(
'code' => 403,
'message' => 'unauthorized'
));
}
Tento způsob se mi opravdu nelíbí, ale myslím si, že funguje… Má tu někdo zkušenosti s Restful či nějaký example?
- looky
- Člen | 99
Pro autentizaci můžeš použít Lookyman/NetteOAuth2Server, který používá OAuth2 server od League.