在 Laravel 应用程序中,Sanctum
和 Passport
是两种流行的 API 认证解决方案,
它们各自具有不同的特点和适用场景。
本文将详细介绍这两者的使用、区别以及何时选择使用其中之一。
Sanctum 是一个轻量级的 API 认证系统,它提供了简单的令牌认证功能,适用于单页应用程序(SPA)、移动应用程序和简单的基于令牌的API。
它允许每个用户为其帐户生成多个API令牌,这些令牌可以被授予指定允许令牌执行哪些操作的能力/范围。
要在 Laravel 项目中使用 Sanctum,首先需要安装:
composer require laravel/sanctum
接着,发布配置文件:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
然后,运行迁移来创建必要的数据库表:
php artisan migrate
在 config/sanctum.php
中可以进行一些配置,根据业务需求进行适当调整。
在 User
模型中,使用 HasApiTokens
trait:
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
使用 Sanctum 实现令牌认证非常简单,下面是一个基本示例:
// 用户注册
Route::post('/register', function (Request $request) {
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password)
]);
return response()->json($user);
});
// 用户登录并获取Token
Route::post('/login', function (Request $request) {
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken('YourAppName')->plainTextToken;
return response()->json(['token' => $token]);
}
return response()->json(['message' => 'Unauthorized'], 401);
});
// 受保护的路由
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
Passport 是一个完整的 OAuth2 认证系统,支持多种认证方法,包括密码授权、客户端凭证授权等,适用于需要多种认证方式的API服务,例如支持各种客户端(Web、移动、API 等)的应用。
安装 Passport:
composer require laravel/passport
发布 Passport 的配置文件并运行迁移:
php artisan migrate
php artisan passport:install
在 User
模型中,使用 HasApiTokens
trait,并在 AuthServiceProvider 中注册 Passport 的路由:
use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
Passport 的使用需要实现 OAuth 2.0 的流程。以下是一个基本示例:
// 用户注册
Route::post('/register', function (Request $request) {
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password)
]);
return response()->json($user);
});
// 使用密码授予访问令牌
Route::post('/login', function (Request $request) {
$request->request->add(['grant_type' => 'password']);
$proxy = Request::create('oauth/token', 'POST');
return Route::dispatch($proxy);
});
// 受保护的路由
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
特性 | Sanctum | Passport |
---|---|---|
复杂性 | 简单易用,适合小型应用。 | 完整的 OAuth2 实现,适合大型应用和多客户端。 |
适用场景 | 适用于 SPA、移动应用、简单的 API。 | 适用于需要 OAuth2 标准的复杂场景。 |
令牌管理 | 使用简单的 API 令牌系统。 | 提供全功能的 OAuth2 银行发行、刷新令牌和作用域管理。 |
依赖库 | 没有外部依赖。 | 需要多个库支持 OAuth2(如 Guzzle)。 |
学习曲线 | 学习曲线较低,快速集成。 | 学习曲线较陡,涉及 OAuth2 的概念和流程。 |
选择 Sanctum:
选择 Passport:
在 Laravel 中,Sanctum
和 Passport
都是强大的 API 认证解决方案,
选择合适的工具取决于你的应用需求和复杂性。
本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net
最新评论