Download suboru v SPA rubrika: Programování: Jiné

Anonym
položil/-a 19.3.2014

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?

Komentáře

  • roman.hocke : Popravdě nevidím rozdíl mezi access token v URL a access token v hlavičce. Tak či tak to putuje v rámci requestu na server. Takže proč to nedat rovnou do URL a nepoužít https, abys acces token "nevyzradil infrastruktuře po cestě"? 21.3.2014
  • diverman : Dobra poznamka, z hlediska bezpecnosti je uplne jedno, jestli je token/hash/whatever v URL nebo hlavicce. 22.4.2014
  • zakjan : Bezpečnost při přenosu - ano, je to úplně jedno. Ale URL se dá zkopírovat, poslat dál, hlavička zas tak jednoduše ne. 26.4.2014
  • roman.hocke : Honzo, máš pravdu, na to jsem nepomyslel. 23.7.2014
odkaz
5 kacerr
odpověděl/-a 20.3.2014

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.

  1. 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)

  2. 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

  3. 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:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.