• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ciasteczka i problem z Path

VPS Starter Arubacloud
+2 głosów
333 wizyt
pytanie zadane 12 lipca 2021 w JavaScript przez Szyszka Gaduła (3,490 p.)
Witam. W aplikacji Angulara otrzymuję ciasteczka od serwera z Path ustawioną na /refresh. Jednak kiedy znajduje się na /refresh, to pliki cookie nie wysyłają się. A kiedy zmienię Path dla pliku cookie na /, to wtedy się wysyła. Dlaczego tak się dzieje, skoro ścieżka jest taka sama? Mimo to, ciasteczka pod F12 widoczne są pod ścieżką /refresh, kiedy jestem w tej lokalizacji, a będąc w lokalizacji / ich nie widać. I tu działa wszystko poprawnie, ale dlaczego te ciasteczka się nie wysyłają? Dzięki za pomoc!
komentarz 12 lipca 2021 przez Wiciorny Ekspert (269,120 p.)
Kompletnie nic nie idzie zrozumieć z tego co piszesz, najlepiej by było jakbyś wkleił kod.
1
komentarz 13 lipca 2021 przez Szyszka Gaduła (3,490 p.)

Serwer daje mi ciasteczka po zalogowaniu:

                    HttpContext.Response.Cookies.Append("refreshToken", refreshToken.Token, new CookieOptions
                    {
                        Path = "/refresh",
                        Expires = refreshToken.Expires,
                        HttpOnly = true,
                        Secure = true,
                        SameSite = SameSiteMode.Strict,
                        IsEssential = true
                    });

Tak wygląda żądanie po cliencie:


  private httpOptionsWithCredentials = {
    headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
    withCredentials: true
  };

  signIn(body: any) {
    return this.http.post(Origins.SafeChatAPIOrigin + 'api/user/login', body, this.httpOptionsWithCredentials);
  }

I dostaję te ciasteczka, bo widzę je, kiedy jestem na localhost:4200/refresh pod F12. Jednak znajdując się w tej samej lokalizacji localhost:4200/refresh chcę wysłać te ciasteczka na serwer, robiąc to żądaniem:

  async getAccessTokenByRefreshToken(): Promise<boolean> {
    return this.http.get(Origins.SafeChatAPIOrigin + 'api/auth/refresh_token', this.httpOptionsWithCredentials).toPromise() as Promise<boolean>;
  }

Te ciasteczka nie wysyłają się na serwer.  (nie ma ich w żądaniu jako nagłówek "cookie").

komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Czy w konsoli przeglądarki są jakieś błędy po wysłaniu requesta z podstrony /refresh? Która to wersja Angulara?

komentarz 13 lipca 2021 przez Szyszka Gaduła (3,490 p.)

Nie ma żadnych błędów :/ Wersja:

Angular CLI: 12.1.1
Node: 14.17.2
Package Manager: npm 6.14.13
OS: win32 x64

Angular: 12.1.1
... animations, cdk, cli, common, compiler, compiler-cli, core
... forms, material, platform-browser, platform-browser-dynamic
... router

Package                         Version
---------------------------------------------------------
@angular-devkit/architect       0.1201.1
@angular-devkit/build-angular   12.1.1
@angular-devkit/core            12.1.1
@angular-devkit/schematics      12.1.1
@schematics/angular             12.1.1
rxjs                            6.6.7
typescript                      4.3.5

 

komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Hmm, na StackOverflow i GitHub piszą, że problemem może być preflight w CORS lub flaga HttpOnly, ale w takim przypadku chyba w ogóle by się ciastka nie wysyłały, a nie tylko na danej podstronie.

Próbowałbym więc debugować dlaczego Angular nie dodaje ciastka do nagłówków w tym konkretnym przypadku.

1
komentarz 13 lipca 2021 przez Wiciorny Ekspert (269,120 p.)
pytanie jaka polityka jest CORS ustawiona? Bo jesli allowed jest np. na * to nie można autoryzowanego requesta robic z cookies bo CORS nie pozwoli ?
Konfiguracja od strony serwera ?
komentarz 13 lipca 2021 przez Szyszka Gaduła (3,490 p.)

Tak to wygląda:

services.AddCors(cfg =>
            {
                cfg.AddDefaultPolicy(cfgPolicy =>
                {
                    cfgPolicy.AllowAnyMethod()
                    .AllowAnyHeader()
                    .SetIsOriginAllowed(cfg => true)
                    .AllowCredentials();
                });
            });

Każda metoda dozwolona, każdy nagłówek, każdy origin i wszystkie poświadczenia.

komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Właśnie, a propo's CORS: @Szyszka wstaw proszę screen z zakładki Headers w panelu Network devtoolsów tego requesta. Istotne jest pokazanie sekcji Request Headers i Response Headers - dane wrażliwe możesz zamazać. Sprawdź też, na wszelki wypadek, czy tego konkretnego requesta nie poprzedza preflight (request pod ten sam URL, tylko że wysłany metodą OPTIONS) - jeśli tak, to wstaw proszę analogiczny screen z jego zakładki Headers.

komentarz 13 lipca 2021 przez Szyszka Gaduła (3,490 p.)

Tutaj żądanie:

Tutaj preflight:

Wydaje mi się, że tych zdjęć nie da się powiększyć, więc daje linka do imgura: https://imgur.com/a/5sn64GO

komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)
Hmm, jak dla mnie wygląda ok. Możesz jeszcze pokazać analogiczne screeny w przypadku gdy ciastka są przesyłane?

W każdym razie, może to faktycznie kwestia czegoś w Angularze i ja bym próbował debugować jego kod, żeby dowiedzieć się dlaczego on nie ustawia ciastek w nagłówku requesta.
komentarz 13 lipca 2021 przez Szyszka Gaduła (3,490 p.)
Drugi screen to preflight:

https://imgur.com/a/aNuXcyl
komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)
Nagłówki wyglądają tak samo, więc od strony HTTP powinno być ok - nie wiem w czym tu jest problem. Jak już wspomniałem - próbowałbym debugować kod Angulara, może gdzieś po drodze z jakiegoś powodu on ignoruje te ciastka.
komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Spróbowałbym też ręcznie wysłać z konsoli analogiczny Ajax - możesz użyć opcji Copy as Fetch, żeby mieć już z grubsza wypełnione dane pokroju URL-a, nagłówków i ciała. Dodałbym  do tego ręcznie nagłówek ciastka i wysłał to (z opcją withCredentials jeśli przez XHR lub { credentials: 'include' } w przypadku użycia Fetch) pod endpoint serwera. Jeśli wtedy ciastka będą dołączone, to raczej na pewno Angular coś wycina w tle.

1
komentarz 13 lipca 2021 przez Szyszka Gaduła (3,490 p.)
Zrobiłem fetcha, dodałem ciasteczka i ciągle się nie wysyłają. Ale te z Path ustawionym na "/" wysyłają się :/
1
komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Hmm... ciekawe.

Dobrze rozumiem, że w ciastku ustawiasz wartość path na "/refresh" a request ślesz pod adres "api/auth/refresh_token"? Jeśli tak, to - sądząc po dokumentacji - przeglądarka nie wysyła ciastek, ponieważ po prostu adresy się nie zgadzają. Powinieneś raczej ustawić path na "/api" (albo pełny URL, pod który wysyłasz request z ciastkiem), bo pod URL z takim początkiem wysyłasz request po refresh token.

Poza tym dlaczego nazywasz path jako "/refresh" a nie np. "/refresh_token" (zgodnie z końcówką URL-a) - chociaż "/refesh_token" raczej też jest błędne, bo path zaczynający się od "/" traktowany jest jako katalog, a "/refresh_token" w Twoim requeście z ciastkiem to jest podkatalog)? Sama nazwa "refresh" nijak nie pasuje do fragmentów URLa, chyba żeby brać pod uwagę występowanie słowa w stringu.

Jeszcze jedno pytanie: dlaczego chcesz mieć path na "/refresh" (czy ogólnie: dlaczego osobny path) zamiast "/"?

komentarz 13 lipca 2021 przez Szyszka Gaduła (3,490 p.)
Ponieważ to jest tylko miejsce, do którego przekierowuje mój AuthGuard, kiedy odmówiono dostępu do zasobu, gdyż access token jest błędny. Wtedy przekierowuję mnie właśnie na /refresh, i stamtąd wysyłam token odświeżania do sprawdzenia przez serwer. Jeśli jest poprawny - tworzę przez set-cookie header access token w ciasteczku i z powrotem przekierowuję użytkownika na strone, do której nie miał dostępu. Więc to "/refresh" to jest tylko po to, żeby nie wysyłać refresh tokena w każdym żądaniu, bo wydaje mi się to dość niebezpieczne. Czyli żeby działało, muszę ustawić Path na "api/auth/refresh_token", tak? Ale teraz sobie myślę, że jeśli przeniosę backend na hosting i frontend też, to domena będzie inna. Obecnie u obu to localhost. I co w takiej sytuacji? Też ciasteczka nie będę się wysyłać? Jest na to sposób? :D
komentarz 13 lipca 2021 przez ScriptyChris Mędrzec (190,190 p.)

Czyli żeby działało, muszę ustawić Path na "api/auth/refresh_token", tak?

Tak wnioskuję po tym, co jest napisane w dokumentacji. :)

Ale teraz sobie myślę, że jeśli przeniosę backend na hosting i frontend też, to domena będzie inna. Obecnie u obu to localhost. I co w takiej sytuacji?

Za domenę dla ciastka odpowiada atrybut domain i - ogólnie dla requestów - CORS. Możesz w aplikacji ustawić zmienną środowiskową, gdzie na hostingu przypiszesz jej domenę hostingu jako wartość, a lokalnie - localhost.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 88 wizyt
pytanie zadane 12 czerwca 2020 w Sieci komputerowe, internet przez WiktroH Mądrala (6,550 p.)
+2 głosów
1 odpowiedź 179 wizyt
pytanie zadane 14 maja 2017 w Offtop przez Mr Popcorn Bywalec (2,340 p.)
0 głosów
1 odpowiedź 490 wizyt
pytanie zadane 20 października 2016 w PHP przez MatiiTv Gaduła (3,790 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...