Tiszteletem a fórumozóknak!
Előzetesen, nem mondanám magam totál kezdőnek, de profil szakértőnek se a témában. megpróbálom pontosan körül írni a helyzetet, ha valahol rosszul fogalmaztam akkor kérném javítani.
Szerintem nem én vagyok az egyetlen aki ezzel küdz, vagy hozzám hasonlóan nem is tudja hogy pontosan mivel küzd (maximum heélyes, vagy téves sejtései vannak róla)
Van egy Angular 6 kliens ami a példa kedvéért http://www.domain.hu, https://www.domain.hu-n van elhelyezve.
Adott egy typescriptben megírt Nodejs backend, ExpressJs, MongoDb, szokásos, aminek a https://api.domain.hu/v1 a kiindulási pontja.
Az Api és a webserver nem egy és ugyanaz a szerver, lokális hálózaton két külön vas.
A teljességhez hozzátartozik még, hogy egy nginx proxy fowrawrdolja az api felé a kéréseket, ami a webszerveren van beállítva, mert maga az api nincs kirakva a nagyplénum elé,
az nginx fogadja internet felöl, és forwardol proxy_pass alapján.
Na most szeretnék beállítani egy CSRF tokenes védelmet...ha kell egyáltalán, mert olyant is olvastam, hogy nem is kell, ha van rendes CORS.
Minnél többet olvasok a témában, annál inkább kezdek elveszni a rengetegben, és nem bírom működésre bírni a CSRF-Token cserét.
A CORS beállítás megvan az api esetében, az origin kizárólag http://www.domain.hu, https://www.domain.hu van engedélyezve, megy is,
máshonnan hívva az apit egyből jön a preflight check error, allow access control hiba...ami rendben is van (vagy legalábbis eddig úgy tűnik, rendben van)
Hozzáteszem ennek se feltétlen ismerem 100%ra a pontos működését, csak nagyságrendileg.
Api esetén telepítve van npm-mel a cookie-parser, meg csurf nevű library, ami azt ígéri, majd mindent megold.
Megnézve az api response-t a set-cookie benne is van, de...még át is tudom nevezni, XSRF-TOKEN-re mert az angular.io ide vágó részében leírják, hogy ha így nevezem el, az angular okos, és intéz mindent.
Ennek ellenére...röviden...nem megy.
( Őszinte legyek, kezd is elmenni tőle a kedvem, mert sosem értettem igazán mire jók a cookie-k egyáltalán. Key, Value tárolásra? Arra ott van session, meg local storage..akkor mire jó még mindig a cookiezás?)
Tehát ha jól értem, az egész CSRF lényege az lenne, hogy az api response headerbe tesz egy set-cookie-t, benne csrf-token=xxxxxxxxxx, path: "/", meg ami kell.
Aztán a következő alkalommal, amikor a kliens api hívást intéz, akkor ezt az azonosítót kiolvassa a cookieból, berakja a request headerbe, és elküldi cookieval együtt az api felé...
az api meg összehasonlítja a két értéket, ha egyezik, a az api kérés oké, generál egy másik tokent, és választban újra beleteszi az új tokent a response headerbe, és így tovább mint a ringispil..
A kliensnek ez alapján a respone headerben található set-cookie csrf=xxxxxxxxxxx alapján nem kellene elmentenie egy cookiet a gépre?
csrf néven, benne a tokennel? mert ez nem történik meg, ha kellene egyáltalán.
Az Api olyan tüneteket produkál, mintha ott minden rendben lenne...kérdés, hogy a kiadott token-t illik-e elmenteni valahol api szinten, mondjuk adatbázisban?
Nem gondolnám, hiszen úgyis a requestben együtt jön a cookie, meg a request headerben a token, tehát minden adott az ellenőrzéshez.
Lehet e probléma, hogy a kliens http is, és nem csak és kizárólag https en érhető el?
Lehet-e baj az, hogy az api meg a kliens két külön aldomain?
ugye www.domain.hu, és api.domain.hu a felállás..érdemes-e áttenni az api-t, ww.domain.hu/api ra? vagy ez maga minden baj forrása? :)
ezt még nem próbáltam ki, bár nem örülnék ha ezt át kellene variálni, de mindent a cél érdekében...
Esetleg Angular bug? olvastam hogy elég érdekesen van megcsinálva Angular alatt a dolog...elvileg automatikusan megold mindent..aztán jönnek a stackoverflow-k, hogy nem megy, mert...
..a kiadott cookie beállításai..
httpOnly: false nak kell lennie, és path="/"..megpróbáltam..nem lett jó...
aztán jött olyan, hogy a post requestnél withCredentials: true,t kell állítani...
Jó lenne olyan angularos hozzászólás aki ezt már meg tudta ugrani angular 4-5-6-tal...az "új" angular/common/http...HttpClient-jével...mert az előd Angularoknál ez másképp volt.
huh...röviden tömören ennyi? :)