Jetstream 集成了 Laravel Sanctum。Laravel Sanctum 为 SPA(单页应用程序)、移动应用程序和简单的基于令牌的 API 提供了一个轻量级的身份验证系统。Sanctum 允许您的应用程序的每个用户为其帐户生成多个 API 令牌。这些令牌可以被授予权限,这些权限指定令牌被允许执行的操作。
默认情况下,API 令牌创建面板可以通过右上角用户配置文件下拉菜单中的“API”链接访问。从这个屏幕,用户可以创建具有各种权限的 Sanctum API 令牌。
Sanctum 文档
有关 Sanctum 的更多信息以及如何向 Sanctum 身份验证的 API 发出请求,请参阅官方 Sanctum 文档。
如果您的应用程序将提供可能被第三方使用的 API,您必须启用 Jetstream 的 API 功能。为此,您应该取消应用程序的 config/jetstream.php
配置文件中的 features
配置选项中相关条目的注释。
'features' => [
Features::profilePhotos(),
Features::api(),
Features::teams(),
],
如果您最初没有使用 --api
选项安装 Jetstream,您可能还需要执行 install:api
Artisan 命令来创建 routes/api.php
文件并安装 Laravel Sanctum。
php artisan install:api
API 令牌可用的权限是使用应用程序的 App\Providers\JetstreamServiceProvider
类中的 Jetstream::permissions
方法定义的。权限被定义为简单的字符串。一旦它们被定义,它们就可以被分配给 API 令牌。
Jetstream::defaultApiTokenPermissions(['read']);
Jetstream::permissions([
'post:create',
'post:read',
'post:update',
'post:delete',
]);
上面的示例中的 defaultApiTokenPermissions
方法可用于指定创建新 API 令牌时应默认选择哪些权限。当然,用户可以在创建令牌之前取消选中默认权限。
对 Jetstream 应用程序发出的每个请求,即使是对 routes/web.php
文件中经过身份验证的路由的请求,也将与一个 Sanctum 令牌对象相关联。您可以使用 Laravel\Sanctum\HasApiTokens
特性提供的 tokenCan
方法来确定关联的令牌是否具有给定的权限。
此 HasApiTokens
特性在 Jetstream 安装期间自动应用于应用程序的 App\Models\User
模型。通常,您将在应用程序的控制器、Livewire 组件或 授权策略 中调用 tokenCan
方法。
return $request->user()->id === $post->user_id &&
$request->user()->tokenCan('post:update')
当用户向 routes/web.php
文件中的路由发出请求时,该请求通常会通过基于身份验证会话 cookie 的守卫由 Sanctum 进行身份验证。在大多数 Laravel 应用程序中,这是 web
守卫。
当用户通过应用程序 UI 发出第一方请求时,tokenCan
方法将始终返回 true
。请记住,这并不一定意味着您的应用程序必须允许用户执行该操作。通常,您的策略将决定是否已授予令牌执行能力的权限,**以及检查用户实例本身是否应该被允许执行该操作**。
例如,在更新博客文章的情况下,这可能意味着检查令牌是否被授权更新文章,**以及**该文章是否属于该用户。
return $request->user()->id === $post->user_id &&
$request->user()->tokenCan('post:update')
最初,允许 tokenCan
方法被调用并始终为第一方 UI 发起的请求返回 true
似乎很奇怪;但是,能够始终假设 API 令牌可用并可以通过 tokenCan
方法进行检查很方便。这意味着您始终可以在应用程序的授权策略中调用 tokenCan
方法,而无需担心请求是来自应用程序的 UI 还是由 API 的第三方使用者发起的。