Přihlašování uživatelů ve veřejném API

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

Ahoj,
budu teď dělat pro jeden projekt veřejné API pro přístup k datům. Co zatím ale neumím správně vyřešit, je přihlašování uživatelů.

Moje myšlenka je taková:

  1. Uživatel pošle (třeba metodou POST) přihlašovací údaje na url třeba /api/auth/login.
  2. Já ho v presenteru normálně přihlásím pomocí $this->user->login($user, $pass).
  3. Pokud je přihlášení úspěšné, tak mu jako autorizační token vrátím SESSION_ID.
  4. Uživatel bude při každém požadavku posílat svůj token…
  5. A já ten token zase zpátky šoupnu do SESSION_ID, aby Nette načetlo dříve přihlášeného uživatele a fungovaly mi metody jako $user->isAllowed(...) apod.

Problém je, že Nette mi nedovolí manipulovat se SESSION_ID. Jaký je tedy správný postup generování autorizačního tokenu, a poté v aplikaci „přeměna“ z tokenu na přihlášeného uživatele?

Díky moc za odpovědi.

Tharos
Člen | 1030
+
+4
-

Doporučil bych vyhnout se všem nestandardním řešením (například takovému, jaké jsi popsal) a namísto toho použít standardní OAuth.

V REST API si klient jasně daným způsobem obstará token, který poté přikládá k requestům na nějakým způsobem chráněné resources. Ty se podle toho tokenu pak na serveru jen rozhodneš, zda lze ona chráněná data vrátit v response, anebo zda jde o nějaký Bad Request (4xx).

Doplnění: U trojpilířového OAuth máš token svázaný s konkrétním uživatelem, kterého si pak můžeš interně v aplikaci označit za přihlášeného (pro ten jeden životní cyklus aplikace) a pak můžeš volně používat zmíněnou isAllowed metodu a další. Session v REST API vůbec nemusíš startovat (dokonce je lepší vyloženě ji nestartovat).

Editoval Tharos (24. 2. 2015 10:26)

bazo
Člen | 620
+
0
-

preco by si mu menil session id? uloz ten token normlane do session ako dalsi udaj, a vzdy ked budes robit rest klientom request na server, mu len nastavis tento token

rovnaky system som pouzil na jednom projekte a vsetko ok

nanuqcz
Člen | 822
+
0
-

Nevím, jestli jsi mě úplně pochopil… Já nemám problém udělat klienta. Já mám problém, jak autorizovat uživatele pomocí tokenu na serveru. Pokud se bavíme o klasické webové aplikaci (ne API) a klient je webový prohlížeč, tak se autorizace dříve přihlášeného uživatele děje automaticky pomocí hodnoty uložené v $_COOKIE[‚SESSION_ID‘]. Já ale nechci nutit REST klienta používat cookies, a tak u mě vzniká problém, jak autentizaci (již dříve přihlášeného uživatele) ošéfovat bez cookies na serveru.

Editoval nanuqcz (24. 2. 2015 5:28)

echo
Člen | 134
+
0
-
Filip Procházka
Moderator | 4668
+
+6
-
  • přijmeš token
  • vytáhneš uživatele podle tokenu, nemusíš vůbec volat ->login($jmeno, $heslo), můžeš tam rovnou předat identitu
$user->login(new Identity($id, $data, ...))
  • profit
bazo
Člen | 620
+
0
-

ved pri tomto sposobe na serveri ziadne cookies nepotrebujes