Download suboru v SPA rubrika: Programování: Jiné
V single-page webaplikacii potrebujem vymysliet bezpecny download suborov. Bezpecny v tom zmysle, subory mozu downloadovat iba autentifikovani uzivatelia. Zacal som tym, ze uzivatel s nejakym accessToken
urobi request na API (a API vdaka tomu vie, ktory user request spravil) aby mohol vykreslit stranku so zoznamom suborov.
GET /files > X-accessToken: blablablabla < 200 < Content-Type: application/json [ {"id":1, "name":"something secret.pdf", "mimeType":"application/pdf"}, {"id":2, "name":"cats are awesome.jpg", "mimeType":"image/jpeg"} ]
SPA z takejto odpovede vie zostavit <a href> odkazy, ktore ale nesplnaju moju poziadavku na bezpecnost - ktokolvek moze odhadnut cestu k downloadu suborov.
<a href="/api/files/{{file.id}}">{{file.name}}</a>
Problem je, ze ja pri klepnuti na taky odkaz neviem pripojit ten svoj header s X-accessToken
, aby API mohlo overit, ze subor chce downloadnut auth user. Blbym riesenim je accessToken pridat k odkazu:
<a href="/api/files/{{file.id}}?accessToken={{accessToken}}">{{file.name}}</a>
Blbe je to pretoze som celej infrastrukture po ceste (proxy, apache logy) vyzradil accessToken uzivatela. Tadialto cesta nevedie.
OK, budem si teda z API ku kazdemu suboru vraciat aj nejaky token (pozor, to nie je accessToken klienta):
GET /files/{id} > X-accessToken: blablablabla < 200 < Content-Type: application/json [ {"id":1, "token":"Ecvu8vniv", "name":"something secret.pdf", "mimeType":"application/pdf"}, {"id":2, "token":"lggb5Mc1Z", "name":"cats are awesome.jpg", "mimeType":"image/jpeg"} ]
a SPA vyrobi link typu:
<a href="/api/files/{{file.id}}?token={{file.token}}">{{file.name}}</a>
Prosim neriesme, ze takyto link moze uzivatel poslat na Facebook alebo emailom. Toto je jeho problem. Platnost tokenu obmedzime povedzme na 2h. Mne to pripomina sposob ako su downloady riesene u filesharing systemov. Tiez pri downloade musite klepnut na odkaz, v ktorom je kilometer bordelu a po hodine uz taky odkaz nie je platny.
A teraz moj problem:
je mozne ten mechanizmus vymysiet tak, aby som na strane API nemusel tokeny ukladat do nejakej persistentnej pamate? Aby overenie, ze na odkaz klepol auth. uzivatel bolo v principe proceduralne (algoritmicke, nejaky vypocet)? AccessToken klienta totiz v ten moment na strane API neviem, nijako som si ho neposlal.
Pretoze, ked na API pride request /api/files/2?token=lggb5Mc1Z
, moj backendista nechce sahat na databazu, kde by si musel tokeny ukladat aby overil request.
Je vobec toto mozne vyriesit algoritmicky?
Neni tohle spis dotaz na to jak se obecne resi v SPA aplikacich user autorization? Na rovinu se priznam, ze s tim praktickou zkusenost nemam, ale predpokladam, ze by to mohlo fungovat nejak takhle.
-
uzivatel se pripoji na server (aby dostal tu SPA napsanou primarne zrejme v JS), tim se na serveru vytvori uzivatelska session, ktera je identifikovana beznym zpusobem (cookies, v http hlavicce, nevim co je ted ta spravna best practice)
-
uz v ramci aplikace se uzivatel nejakym zpusobem autentizuje, posle serveru neco podle ceho ho server muze identifikovat (form, oauth, urcite je spousta dalsich moznosti) a zaroven si server do uzivatelske session ulozi informaci, ze je prihlasen a kdo to je
- download link povede na nejake url, na kterem bude skript, ktery z uzivatelske session zjisti kdo to chce, jestli na to ma narok a pak ten soubor proste poskytne nebo ne.
Mozna ze se v necem pletu, protoze SPA jsem nikdy nepsal, pouze weby, kde treba podstatna cast bezela v js a ajax requestama to chtelo obsah. Skripty ktere obsluhovaly tyhle XHR requesty mely pristup k session a mohly se podle toho rozhodnout.
Pro zobrazení všech 5 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře