Niepoprawny token CSRF przy integracji z serwerem

Niepoprawny token CSRF przy integracji z serwerem
Idzi
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Nowa Sól
  • Postów: 11
0

Chciałbym skonfigurować Laravel do współpracy z Vue na swoim komputerze.
Instaluję świeżą kopię Laravel.
Potem Breeze, z opcją, tylko API.
W pliku .env ustawiam następująco:

Kopiuj
APP_URL=http://localhost:8000
FRONTEND_URL=http://localhost:5173
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:5173

W Vue, mam prosty kod, który ma zalogować użytkownika.

Kopiuj
axios.defaults.withCredentials = true

const onSubmit = async () => {
  await axios('http://localhost:8000/sanctum/csrf-cookie')
  await axios.post('http://localhost:8000/login', {
    email: form.value.email,
    password: form.value.password
  })
  const data = await axios('http://localhost:8000/api/user')
}

Otrzymuję błąd 419.
CSRF token mismatch.

Użeraliście się już może z tym?
(Stack Overflow przeszukany, hinduskie poradniki na YouTube również)

serek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1506
4

Jak używasz API, to weź wyłącz obsługę CSRF. Bo teraz Laravel wymaga podania tokenu, a Ty mu nic nie wysyłasz.

W ogóle masz API, które zachowuje stan? Bez sensu... API z sesją to nie jest dobry pomysł. Poczytaj sobie o JWT.

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
1

W routes powinieneś prawidłowo utworzyć nową grupę np.: api i i dla tej grupy w midleware wyłączyć obsługę csrf.
Na początek jednak zrób jak pisze serek powyżej.

Idzi
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Nowa Sól
  • Postów: 11
0
serek napisał(a):

Jak używasz API, to weź wyłącz obsługę CSRF. Bo teraz Laravel wymaga podania tokenu, a Ty mu nic nie wysyłasz.

W ogóle masz API, które zachowuje stan? Bez sensu... API z sesją to nie jest dobry pomysł. Poczytaj sobie o JWT.

Wydaje mi się, że dzięki ustawieniu axios.defaults.withCredentials = true, axios automatycznie wysyła token przypisany do localhost:8000. Preferowanym sposobem autoryzacji API w Laravel jest Sanctum, nie JWT.

jurek1980 napisał(a):

W routes powinieneś prawidłowo utworzyć nową grupę np.: api i i dla tej grupy w midleware wyłączyć obsługę csrf.
Na początek jednak zrób jak pisze serek powyżej.

API routes zostawiłem jak po zainstalowaniu, tylko ze ścieżką do user. CSRF wyłączyłem w config -> sanctum -> middleware. Bez zmian.

serek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1506
0
Idzi napisał(a):
serek napisał(a):

Jak używasz API, to weź wyłącz obsługę CSRF. Bo teraz Laravel wymaga podania tokenu, a Ty mu nic nie wysyłasz.

W ogóle masz API, które zachowuje stan? Bez sensu... API z sesją to nie jest dobry pomysł. Poczytaj sobie o JWT.

Wydaje mi się, że dzięki ustawieniu axios.defaults.withCredentials = true, axios automatycznie wysyła token przypisany do localhost:8000.

Ale Ty mylisz tokeny, token CRSF to nie jest token do autoryzacji. Ja mówię o CSRF, że w API się go nie wysyła.

Idzi napisał(a):

Preferowanym sposobem autoryzacji API w Laravel jest Sanctum, nie JWT.

Niech będzie cokolwiek, byleby było.

Idzi napisał(a):
jurek1980 napisał(a):

W routes powinieneś prawidłowo utworzyć nową grupę np.: api i i dla tej grupy w midleware wyłączyć obsługę csrf.
Na początek jednak zrób jak pisze serek powyżej.

API routes zostawiłem jak po zainstalowaniu, tylko ze ścieżką do user. CSRF wyłączyłem w config -> sanctum -> middleware. Bez zmian.

Hmm, nie rozumiem co ma ten Sanctum do CSRF. To się dwie różne rzeczy.

Weź wyłącz globalnie CSRF dla api. Z tego co widzę, to trzeba zrobić coś takiego: https://stackoverflow.com/a/59384244

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.