réponses
212 vues
Laravel Sanctum authentification avec React
Bonjour. j'ai un pb avec l'authentification de sanctum. dans mon code LoginController je verifie les credentials puis si tout est bon je retourne le jeton d'Api
1public function login(Request $request)2{3 $credentials = $request->only(['email', 'password']);45 if (Auth::attempt($credentials)) {6 // Récupérer l'utilisateur authentifié7 $user = Auth::user();89 // Générer un jeton d'API pour l'utilisateur10 // ...11 $token = $user->createToken('Token Name')->plainTextToken;1213 // Retourner le token dans la réponse JSON14 return response()->json(['token' => $token], 200);15 } else {16 return response()->json(['error' => 'Unauthorized'], 401);17 }18}1public function login(Request $request)2{3 $credentials = $request->only(['email', 'password']);45 if (Auth::attempt($credentials)) {6 // Récupérer l'utilisateur authentifié7 $user = Auth::user();89 // Générer un jeton d'API pour l'utilisateur10 // ...11 $token = $user->createToken('Token Name')->plainTextToken;1213 // Retourner le token dans la réponse JSON14 return response()->json(['token' => $token], 200);15 } else {16 return response()->json(['error' => 'Unauthorized'], 401);17 }18}
et ici jái ma route vers le login
1Route::post('v1/login', [LoginController::class, 'login']);1Route::post('v1/login', [LoginController::class, 'login']);
ici mon code React qui test l'auth
1import axios from 'axios';23const csrfTokenElement = document.querySelector('meta[name="csrf-token"]');4const csrfToken = csrfTokenElement ? csrfTokenElement.getAttribute('content') : null;56axios.defaults.headers.common['X-CSRF-TOKEN'] = csrfToken || '';78// axios.defaults.withCredentials = true;9// axios.defaults.withXSRFToken = true;1011export async function signInRequest (email: string, password: string) {12 // console.log(email, password);1314 try {16 email,17 password18 });1920 console.log(response.data);21 // localStorage.setItem('token', response.data.token);22 } catch (error) {23 console.error('Erreur lors de l\'authentification : ', error);24 throw error;25 }26}1import axios from 'axios';23const csrfTokenElement = document.querySelector('meta[name="csrf-token"]');4const csrfToken = csrfTokenElement ? csrfTokenElement.getAttribute('content') : null;56axios.defaults.headers.common['X-CSRF-TOKEN'] = csrfToken || '';78// axios.defaults.withCredentials = true;9// axios.defaults.withXSRFToken = true;1011export async function signInRequest (email: string, password: string) {12 // console.log(email, password);1314 try {16 email,17 password18 });1920 console.log(response.data);21 // localStorage.setItem('token', response.data.token);22 } catch (error) {23 console.error('Erreur lors de l\'authentification : ', error);24 throw error;25 }26}
le pb est que je lorsque je j'utilise la methode post ça ne marche pas j'ai une erreur de type : POST http://localhost:8000/api/v1/login 419 (unknown status) mais quand j'utilise get j'obtient bien mon token. mais pour des raisons de securité je dois use post donc j'aimerais comprendre qu'es ce qui peut causer cela ?
Bonjour toi, j'espère que tu vas bien!! L'erreur 419 survient généralement lorsque le jeton CSRF n'est pas posté ou soit celui-ci à expiré.
Maintenant dans ton cas tu utilises react donc tu n'as pas trop besoin du jeton CSRF ( à mon avis ). Tu dois plus tôt au niveau de ton front-end ( côté react) configurer axios pour qu’il envoie le cookie de session avec chaque requête. Ce qui permettra de déterminer l'utilisateur connecté à chaque requête.
En effet quand je consulte dans les tools du navigateur le jeton CSRF n'est pas dans le header de la requête. Mais comment je fais pour récupérer le cookie de session ? Puisque la première requête dauth
j'ai resolu le problème en faisant ceci
1export const signInRequest = (email: string, password: string) => {2 // console.log(email, password);35 // Login...6 try {8 email,9 password10 });1112 // console.log(response.data);13 getClientsRequest();14 } catch (error) {15 console.log((error as any).response.data.message);16 }17 });1819}1export const signInRequest = (email: string, password: string) => {2 // console.log(email, password);35 // Login...6 try {8 email,9 password10 });1112 // console.log(response.data);13 getClientsRequest();14 } catch (error) {15 console.log((error as any).response.data.message);16 }17 });1819}
en fait il fallait d'emblé faire une requete vers sanctum/csrf-cookie pour recuperer le cookie et le stocker (automatique avec axios) puis utiliser dans toutes les autres requêtes (c'est expliqué dans la doc). et dans mon controller j'utilise désormais un cookie de session
LoginController
1public function login(Request $request)2{3 $request->validate([4 'email' => 'required|email',5 'password' => 'required',6 ]);78 if (Auth::attempt($request->only('email', 'password'))) {9 $user = Auth::user();10 $token = $user->createToken('login')->plainTextToken;1112 // Ajouter le cookie de session pour l'utilisateur authentifié13 $cookie = cookie('token', $token, 15); // Durée de validité de 15 minutes1415 return response()->json(['token' => $token], 200)->withCookie($cookie);16 }1718 throw ValidationException::withMessages([19 'email' => ['The provided credentials are incorrect.'],20 ]);21}1public function login(Request $request)2{3 $request->validate([4 'email' => 'required|email',5 'password' => 'required',6 ]);78 if (Auth::attempt($request->only('email', 'password'))) {9 $user = Auth::user();10 $token = $user->createToken('login')->plainTextToken;1112 // Ajouter le cookie de session pour l'utilisateur authentifié13 $cookie = cookie('token', $token, 15); // Durée de validité de 15 minutes1415 return response()->json(['token' => $token], 200)->withCookie($cookie);16 }1718 throw ValidationException::withMessages([19 'email' => ['The provided credentials are incorrect.'],20 ]);21}
Il faut Se connecter ou Créer un compte pour participer à cette conversation.