Mit Laravel Sanctum ist es relativ einfach, eine Benutzerregistrierung für eine API einzubauen. Dazu muss ab Laravel 11 die API installiert werden. Vor Laravel 11 ist die schon eingebaut. Dafür sorgt der Befehl

php artisan install:apiCode-Sprache: Bash (bash)

Als nächstes braucht die Klasse User das Trait HasApiTokens:

use Laravel\Sanctum\HasApiTokens;

// ...

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasApiTokens;

    // ...
}Code-Sprache: PHP (php)

Nun brauchen wir einen Controller, in dem die Registrierung sowie der Login und der Logout verarbeitet wird:

php artisan make:controller Api/AuthControllerCode-Sprache: Bash (bash)

Die entsprechenden Funktionen können dann z.B. folgendermaßen aussehen:

use App\Models\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;

// ...

/**
 * Register a new user
 */
public function register(Reqeust $request)
{
    $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:8'
    ]);

    User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => Hash::make($request->password)
    ]);

    return response()->json([
        'success' => true,
        'message' => 'User registered successfully.',
    ]);
}

/**
 * Log the user in
 */
public function login(Request $request)
{
    $request->validate([
        'email' => 'required|string|email',
        'password' => 'required|string',
    ]);

    if (!Auth::attempt($request->only('email', 'password'))) {
        throw ValidationException::withMessages([
            'email' => [ 'The provided credentials are not correct' ]
        ]);
    }

    $user = $request->user();

    $token = $user->createToken('auth_token')->plainTextToken;
    
    return reponse()->json([
        'success' => true,
        'message' => 'User login successfully.',
        'data' => [
            'token' => $token
        ]
    ]);
}

/**
 * Log the user out.
 */
public function logout(Request $request)
{
    $request->user()->tokens()->delete();

    return response()->json([
        'success' => true,
        'message' => 'User logged out successfully.'
    ]);
}Code-Sprache: PHP (php)

Nun muss nur noch die api.php für die entsprechenden Routen angepasst werden:

use App\Http\Controllers\Api\AuthController;

// ...

Route::post('/register', [AuthController::class, 'register']);
Route::post('/login', [AuthController::class, 'login']);
Route::post('/logout', [AuthController::class, 'logout'])->middleware('auth:sanctum');Code-Sprache: PHP (php)

Wichtig: Alle Routen, bei denen der Benutzer angemeldet sein muss, brauchen die Middleware auth:sanctum. So auch die Logout-Route, die ja nur dann Sinn macht, wenn der Benutzer angemeldet ist.

Nun kann man die Routen mit curl oder einem anderen Programm testen.

Registrierung:

curl -X POST \
    --header 'Accept: application/json' \
    -d "name=Joe&email=my_email@example.org&password=abcd1234" \
    "http://127.0.0.1:8000/api/register"Code-Sprache: Bash (bash)

Login:

curl -X POST \
    --header 'Accept: application/json' \
    -d "email=my_email@example.org&password=abcd1234" \
    "http://127.0.0.1:8000/api/login"Code-Sprache: Bash (bash)

Logout:

curl -X POST \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer 5|mjUhxKPAsRqADS9y1vXcEANHw7l9dvYelOXV12IM4d579c2f' \
    "http://127.0.0.1:8000/api/logout"Code-Sprache: Bash (bash)