在Laravel中验证API用户的超简单方法

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

自从 Laravel 5.3 推出以来,Laravel Passport 成为了对 API 消费者进行身份验证的主要方式。这是 Laravel 文档中描述的唯一方法。如果你在 Laravel 文档网站上搜索“auth:api”,唯一的结果都会与 Laravel Passport 相关。

然而,在某些情况下,你可能并不需要 Laravel Passport 提供的复杂功能。例如,如果你只是为用户提供几个 API 路由,用于更新数据,那么你可能不需要一个完整的 OAuth 系统,也不需要多个数据库表来存储可能过期的令牌,更不需要引入整个 Laravel Passport 包。


第一步:配置数据库

首先,你需要为用户提供一个 API 令牌,并将其存储在数据库中。最简单的方式是将令牌存储在用户表中。以下是迁移代码示例

// 创建迁移文件
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('api_token', 36)->unique();
    });
}

// 回滚迁移
public function down()
{
    Schema::table('users', function (Blueprint $table) {
        $table->dropColumn('api_token');
    });
}

第二步:生成令牌

在数据库配置完成后,你需要为用户生成 API 令牌。你可以选择让用户手动生成令牌,或者为每个用户自动生成一个。以下是使用 Laravel 5.6 提供的 UUID 生成器的示例代码:

// app/User.php
public function setNewApiToken()
{
    $this->api_token = Str::uuid();
    $this->save();
}

// 使用示例
auth()->user()->setNewApiToken();
// 或者
$user->setNewApiToken();

第三步:检查配置文件

Laravel 默认的 auth.php 配置文件已经为 API 令牌认证做好了准备。你只需要确保它的配置正确即可:

// config/auth.php
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token', // 这是关键配置
        'provider' => 'users',
    ],
],

第四步:添加中间件

所有 API 路由都应放置在 routes/api.php 文件中。对于需要身份验证的路由,可以使用 auth:api 中间件,如下所示:

// routes/api.php
Route::post('post', 'Api\PostController@store')->middleware('auth:api');

用户需要在请求中添加查询字符串参数,例如 api_token=UNIQUE_TOKEN。如果你的网站使用 JavaScript 进行 AJAX 调用,也可以通过以下方式传递令牌:

axios.put('/api/user/profile', {
    name: this.newName,
    some_field: this.newFieldValue,
}, {
    params: {
        'api_token': this.user.api_token
    }
}).then(response => {
    // 处理响应
});

第五步:启用令牌认证

Laravel 文档中没有详细说明如何启用令牌认证,但实际上 Laravel 已经提供了所需的一切。你只需要在 AuthServiceProvider.php 中注册相关类即可:

// app/Providers/AuthServiceProvider.php
use IlluminateAuthTokenGuard;
use IlluminateSupportFacadesAuth;

public function boot()
{
    $this->registerPolicies();    Auth::extend('token', function ($app, $name, array $config) {
        return new TokenGuard(
            Auth::createUserProvider($config['provider']),
            $app->request
        );
    });
}

以上代码会注册一个新的 TokenGuard,用于处理基于令牌的用户认证。值得庆幸的是,Laravel 已经内置了 TokenGuard 类,你只需要知道如何使用它。


通过以上步骤,你可以轻松地在 Laravel 中实现基于 API 令牌的用户认证,而无需引入 Laravel Passport 的复杂性。这种方法特别适合那些只需要简单 API 身份验证的场景。

原文链接: https://mydnic.be/post/super-easy-way-to-authenticate-an-api-user-in-your-laravel-application-without-using-laravel-passport