如何使用Laravel Sanctum对API进行身份验证 - Flixtechs

作者:API传播员 · 2026-01-10 · 阅读时间:5分钟

在构建 Laravel Sanctum 来保护您的 Laravel API。本文假设您对 Laravel 和 REST API 有基本的了解,并将指导您完成从项目初始化到 API 身份验证的完整流程。


前置准备

在开始之前,您需要完成以下准备工作:

  1. 创建一个新的 Laravel 项目,并在 .env 文件中设置数据库连接。
  2. 安装 Laravel UI 包并生成身份验证脚手架:

    composer require laravel/ui
    php artisan ui bootstrap --auth

    执行上述命令后,您将拥有一个可用的身份验证脚手架。

接下来,我们将以创建一个简单的 Todos API 为例,演示如何使用 Sanctum 实现身份验证。


第一步:创建模型和控制器

首先,创建一个 Todo 模型及其相关资源:

php artisan make:model Todo -a

上述命令会生成 Todo 模型、迁移文件、种子文件、控制器和工厂。接下来,打开迁移文件并添加以下代码:

public function up()
{
    Schema::create('todos', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->boolean('complete')->default(false);
        $table->timestamps();
    });
}

运行迁移命令以创建数据库表:

php artisan migrate

第二步:安装 Sanctum 并配置

安装 Laravel Sanctum:

composer require laravel/sanctum

接着,发布 Sanctum 的配置文件和迁移文件:

php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
php artisan migrate

User 模型中引入 HasApiTokens 特性:

use LaravelSanctumHasApiTokens;

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

最后,在 config/auth.php 文件中,将 API 的守卫驱动设置为 sanctum

'guards' => [
    'api' => [
        'driver' => 'sanctum',
        'provider' => 'users',
    ],
],

第三步:定义路由

打开 RouteServiceProvider 文件,并取消注释 $namespace 属性:

protected $namespace = 'App\Http\Controllers';

接着,在 routes/api.php 文件中添加以下路由:

Route::post('/login', 'APIUserController@login');
Route::middleware('auth:sanctum')->group(function () {
    Route::delete('/logout', 'APIUserController@logout');
    Route::resource('todos', 'TodosController');
});

第四步:实现登录和注销功能

创建 UserController 控制器:

php artisan make:controller API/UserController

UserController 中添加以下代码:

    return response()->noContent();
}

}

use AppHttpControllersController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesHash;
use IlluminateValidationValidationException;
use AppModelsUser;

class UserController extends Controller
{
public function login(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => '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.'],
]);
}

return response()->json([
'token' => $user->createToken($request->device_name)->plainTextToken,
]);
}

public function logout(Request $request)
{
$request->user()->currentAccessToken()->delete();

return response()->noContent();
}
}

第五步:返回 JSON 数据

Todo 模型生成资源类:

php artisan make:resource TodoResource

TodosController 中返回 JSON 数据,例如:

use AppHttpResourcesTodoResource;
use AppModelsTodo;

public function index()
{
    $todos = Todo::all();
    return TodoResource::collection($todos);
}

第六步:测试身份验证

您可以使用 curl 或 Postman 测试 API。以下是一些示例命令:

  1. 测试未授权访问:

    curl http://127.0.0.1:8000/api/todos -H "Accept: application/json"

    返回结果:

   {
       "message": "Unauthenticated."
   }
  1. 登录并获取令牌:

    curl -X POST http://127.0.0.1:8000/api/login 
    -H "Accept: application/json" 
    -d "email=example@example.com" 
    -d "password=yourpassword" 
    -d "device_name=curl-client"

    返回结果:

   {
       "token": "your-generated-token"
   }
  1. 使用令牌访问受保护的资源:
    curl http://127.0.0.1:8000/api/todos 
    -H "Accept: application/json" 
    -H "Authorization: Bearer your-generated-token"

总结

通过本文的步骤,您已经成功使用 Laravel Sanctum 为 API 添加了身份验证功能。我们演示了如何创建模型、配置 Sanctum、定义路由以及实现登录和注销功能。最后,我们还测试了 API 的身份验证功能。

更多详细信息,请参考 Laravel 官方文档。祝您编码愉快!

原文链接: https://flixtechs.co.zw/posts/how-to-authenticate-apis-with-laravel-sanctum