Ujasnění REST API + auth v Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Carson
Člen | 35
+
0
-

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
+
0
-

A máš teda problém s API autorizací/autentizací nebo RESTovou částí?

Editoval CZechBoY (10. 10. 2016 17:33)

Carson
Člen | 35
+
0
-

Primárně se mi jedná o autorizaci a autentizaci. REST část je mi jasnější, ale rád si své vědomosti zlepším.

CZechBoY
Člen | 3608
+
0
-

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
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

Tak kontroluj ještě IP a třeba http hlavičky klienta.

srigi
Nette Blogger | 558
+
0
-

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
+
+1
-

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)

iguana007
Člen | 970
+
+2
-

Hodně by ti to mohl ulehčit tento addon: https://github.com/drahak/Restful

Carson
Člen | 35
+
+1
-

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
+
0
-

Pro autentizaci můžeš použít Lookyman/NetteOAuth2Server, který používá OAuth2 server od League.