在Laravel中验证API用户的超简单方法
自从 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