Laravel开发:如何使用Laravel Sanctum实现API身份验证和授权?

Laravel是一款流行的PHP Web开发框架,它提供了许多强大的功能和工具来简化Web应用程序的开发和维护。Laravel Sanctum是Laravel框架的一个插件,它提供了API身份验证和授权的功能,可以轻松地保护您的API端点免受未经授权的访问。

在本文中,我们将学习如何使用Laravel Sanctum实现API身份验证和授权。

一、什么是Laravel Sanctum?

Laravel Sanctum是一个轻量级的身份验证包,它提供了简单但强大的API身份验证和授权功能。它基于Laravel中间件和HTTP认证,允许我们安全地将身份验证令牌附加到API请求中。

Laravel Sanctum支持两种身份验证方式:基于Cookie的身份验证和基于Token的身份验证。基于Cookie的身份验证使用Laravel中间件来验证请求中是否存在有效的认证Cookie。另一种验证类Header中的Token并检查其是否有效。

二、安装Laravel Sanctum

在开始之前,我们需要先安装Laravel Sanctum。使用composer包管理器可以轻松地安装Laravel Sanctum:

composer require laravel/sanctum登录后复制

{ "require": { "laravel/sanctum": "^2.9" } }登录后复制

php artisan vendor:publish --tag=sanctum-config php artisan vendor:publish --tag=sanctum-migrations php artisan migrate登录后复制

  • 首先,需要添加laravel / sanctum中间件到您的应用程序的HTTP内核中。
  • 修改app/Http/kernel.php文件,添加Sanctum中间件:

    // app/Http/Kernel.php protected $middleware = [ // ... LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful::class, ]; protected $middlewareGroups = [ 'web' => [ // ... ], 'api' => [ LaravelSanctumHttpMiddlewareEnsureFrontendRequestsAreStateful::class, 'throttle:api', IlluminateRoutingMiddlewareSubstituteBindings::class, ], ];登录后复制

  • 接下来,需要配置auth配置文件。
  • 打开config/auth.php文件,找到defaults和guards并将它们配置为使用sanctum。

    // config/auth.php 'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'sanctum', 'provider' => 'users', 'hash' => false, ], ],登录后复制

  • 添加Sanctum提供者。
  • 如果您使用的是新版本的Laravel,则不需要添加提供者。如果您使用的是旧版本,请打开config/app.php文件并在providers数组中添加以下行:

    LaravelSanctumSanctumServiceProvider::class,登录后复制

    现在,我们已经配置了Laravel Sanctum,接下来我们将了解如何使用Sanctum来创建授权令牌。

  • 在用户登录后,在users表中为该用户创建一个API令牌。
  • public function createToken(Request $request) { $user = Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password')]); if($user) { $token = $user->createToken('API Token')->plainTextToken; return response()->json([ 'token' => $token, ]); } else { return response()->json([ 'message' => 'Invalid credentials', ], 401); } }登录后复制