Laravel 11:带有 Laravel Sanctum 的 API 路由

195 阅读2分钟

要开始使用 Laravel Sanctum,您首先需要通过 API 命令安装包:

安装 Laravel Sanctum

php artisan install:api

我们需要创建一个 AuthController 来处理用户的令牌生成。首先,使用以下命令创建控制器: php artisan make:controller API/AuthController

然后,打开位于 的新 app/Http/Controllers/API/AuthController.php 创建的 AuthController 并添加以下代码:

<?php
namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;

class AuthController extends Controller
{
    // Method to handle user authentication and token generation
    public function generateToken(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
        ]);

        $user = User::where('email', $request->email)->first();

        if (! $user || ! Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['The provided credentials are incorrect.'],
            ]);
        }

        $token = $user->createToken('my-app-token')->plainTextToken;

        return response()->json(['token' => $token], 200);
    }

    // Method to handle user logout and token revocation
    public function logout(Request $request)
    {
		// Revoke all tokens...
		$request->user()->tokens()->delete();

		// // Revoke the current token
		$request->user()->currentAccessToken()->delete();

		return response()->json(['message' => 'You have been successfully logged out.'], 200);
    }
}

此方法验证用户的凭据,然后生成具有指定功能的新令牌。/auth/token 路由对未经身份验证的用户开放,而 /auth/logout 路由受 auth:sanctum 中间件保护,确保只有经过身份验证的用户才能访问它。我们现在就开始吧。

使用 Middleware 保护路由

Sanctum 提供了可应用于 API 路由以保护它们的中间件。这可确保只有经过身份验证的请求才能访问这些路由。 您可以通过将 auth:sanctum 中间件应用于 routes/api.php 中的路由来保护您的路由。

<?php
use App\Http\Controllers\API\UserController;
use App\Http\Controllers\API\PostController;
use App\Http\Controllers\API\AuthController;

// Public routes
Route::post('/auth/token', [AuthController::class, 'generateToken']);

Route::middleware(['auth:sanctum'])->group(function () {
    // Protected User API routes
    Route::get('/users', [UserController::class, 'index']);
    Route::get('/users/{id}', [UserController::class, 'show']);

    // Protected Post API routes
    Route::get('/posts', [PostController::class, 'index']);
    Route::get('/posts/{id}', [PostController::class, 'show']);

    // Logout route
    Route::post('/auth/logout', [AuthController::class, 'logout']);
});

使用此中间件后,只有具有有效 Sanctum 令牌的经过身份验证的请求才能访问受保护的路由。我们在之前的一篇文章中创建了这些路由,名为 Laravel 11 for Beginners: API Resources