Laravel中Sanctum和Passport的使用与区别

在 Laravel 应用程序中,SanctumPassport 是两种流行的 API 认证解决方案,
它们各自具有不同的特点和适用场景。
本文将详细介绍这两者的使用、区别以及何时选择使用其中之一。

一、Laravel Sanctum

1. 什么是 Sanctum?

Sanctum 是一个轻量级的 API 认证系统,它提供了简单的令牌认证功能,适用于单页应用程序(SPA)、移动应用程序和简单的基于令牌的API。
它允许每个用户为其帐户生成多个API令牌,这些令牌可以被授予指定允许令牌执行哪些操作的能力/范围。

2. 安装和配置

要在 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;
}

3. 使用示例

使用 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();
});

二、Laravel Passport

1. 什么是 Passport?

Passport 是一个完整的 OAuth2 认证系统,支持多种认证方法,包括密码授权、客户端凭证授权等,适用于需要多种认证方式的API服务‌,例如支持各种客户端(Web、移动、API 等)的应用。

2. 安装和配置

安装 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();
}

3. 使用示例

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 的主要区别

特性 Sanctum Passport
复杂性 简单易用,适合小型应用。 完整的 OAuth2 实现,适合大型应用和多客户端。
适用场景 适用于 SPA、移动应用、简单的 API。 适用于需要 OAuth2 标准的复杂场景。
令牌管理 使用简单的 API 令牌系统。 提供全功能的 OAuth2 银行发行、刷新令牌和作用域管理。
依赖库 没有外部依赖。 需要多个库支持 OAuth2(如 Guzzle)。
学习曲线 学习曲线较低,快速集成。 学习曲线较陡,涉及 OAuth2 的概念和流程。

四、何时选择使用 Sanctum 或 Passport

  • 选择 Sanctum

    • 当你需要为一个小型应用程序或单页面应用程序(SPA)提供简单的 API 认证时。
    • 当你不需要 OAuth2 的复杂性,并且希望快速集成后端与前端时。
  • 选择 Passport

    • 当你需要支持多种客户端(如 Web、移动)时。
    • 当你需要实现 OAuth2 的标准流程(如授权码授予、密码授予等)时。
    • 当你需要更复杂的权限和作用域管理时。

结论

在 Laravel 中,SanctumPassport 都是强大的 API 认证解决方案,
选择合适的工具取决于你的应用需求和复杂性。

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共0条评论