Rzuciłem na szybko okiem na twój kod i rzeczy które moim zdaniem możesz zmienić to m.in:
1. Skoro ogarniasz rejestrację i logowanie po stronie Vue + Sanctum, to wywaliłbym wszystko co dostarczyło Ci Laravel/ui* auth, czyli widoki, controllery itd.
2. Samą logikę odpowiedzialną za logowanie i wylogowywanie wywaliłbym z UserController do innego controllera np, LoginController, albo do dwóch mniejszych "single action" controllerów np. LoginController i LogoutController.
3. Hashowanie hasła
$data = $request->all();
$check = User::create([
'name' => $data['name'],
'password' => Hash::make($data['password']), // <= O tutaj :D
'email' => $data['email'],
]);
Możesz przenieść do mutatora w modelu User:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// Tutaj
public function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}
}
Dzięki czemu przy każdym tworzeniu użytkownika, wystarczy że podasz "gołe" hasło, a reszta wykona "pod maską":
$data = $request->all();
$check = User::create([
'name' => $data['name'],
'password' => $data['password'],
'email' => $data['email'],
]);
// Tutaj ładniejsza wersja
User::create($request->all());
// A tutaj ładniejsza i na pewno BEZPIECZNIEJSZA
User::create($request->validated());
4. Jak wspomniałem wyżej jeżeli używasz FormRequestów i chcesz przekazać od razu do metody create(), wszystkie pola z requestu, nigdy nie rób tego przy pomocy, $request->all(), ponieważ zwraca ona jak sama nazwa wskazuje WSZYSTKIE pola, wysłane requeście, więc dla lepszego zobrazowania załóżmy że masz w modelu User taką tablicę $fillable:
protected $fillable = ['name', 'password','email', 'is_admin'];
Twój formularz rejestracji zawiera tylko 3 inputy: name, password, email. Nic nie stoi jednak na przeszkodzie, aby ktoś dodał sobie w htmlu dodatkowego inputa "is_admin" i przekazał tam wartość 1, dzięki temu: Bang - został adminem.
Jednak gdy użyjesz $request->validated(), wtedy ta metoda zwróci jedynie pola uwzględnione w metodzie rules() w twoim FormRequeście
public function rules()
{
// Nie ma tutaj pola "is_admin", więc zostanie pominiete
return [
'name' => 'required',
'password' => 'required',
'email' => 'required'
];
}
4. Zauważyłem, że tworzysz specjalnie zmienną $success po to aby określić status odpowiedzi, jest to jednak niepotrzebne bo do tego służą kody odpowiedzi HTTP, więc na przykładzie:
// Przykładowe logowanie
public function login(LoginRequest $request) {
if(!Auth::attempt($request->only(['name', 'password']))) {
// ... Some magic logic
return response()->json(['message' => 'Invalid credentials'] ,401); // Kod zamiast zmiennej
}
// ...
return response()->json(['message' => 'Ok!'], 200); // A tutaj kolejny
}
A wtedy w Vue możesz zrobić taki myk z axiosem:
axios.post(twoj_url_do_logowania, credentials)
.then(res => {
console.log(res.status) // 200
}).catch(e => {
console.log(e.response.status) // 401
})