logo

API

简介

Jetstream 集成了 Laravel Sanctum。Laravel Sanctum 为 SPA(单页应用程序)、移动应用程序和简单的基于令牌的 API 提供了一个轻量级的身份验证系统。Sanctum 允许您的应用程序的每个用户为其帐户生成多个 API 令牌。这些令牌可以被授予权限,这些权限指定令牌被允许执行的操作。

Screenshot of Laravel Jetstream API

默认情况下,API 令牌创建面板可以通过右上角用户配置文件下拉菜单中的“API”链接访问。从这个屏幕,用户可以创建具有各种权限的 Sanctum API 令牌。

Sanctum 文档

有关 Sanctum 的更多信息以及如何向 Sanctum 身份验证的 API 发出请求,请参阅官方 Sanctum 文档

启用 API 支持

如果您的应用程序将提供可能被第三方使用的 API,您必须启用 Jetstream 的 API 功能。为此,您应该取消应用程序的 config/jetstream.php 配置文件中的 features 配置选项中相关条目的注释。

php
'features' => [
    Features::profilePhotos(),
    Features::api(),
    Features::teams(),
],

如果您最初没有使用 --api 选项安装 Jetstream,您可能还需要执行 install:api Artisan 命令来创建 routes/api.php 文件并安装 Laravel Sanctum。

shell
php artisan install:api

定义权限

API 令牌可用的权限是使用应用程序的 App\Providers\JetstreamServiceProvider 类中的 Jetstream::permissions 方法定义的。权限被定义为简单的字符串。一旦它们被定义,它们就可以被分配给 API 令牌。

php
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 方法。

php
return $request->user()->id === $post->user_id &&
       $request->user()->tokenCan('post:update')

第一方 UI 发起的请求

当用户向 routes/web.php 文件中的路由发出请求时,该请求通常会通过基于身份验证会话 cookie 的守卫由 Sanctum 进行身份验证。在大多数 Laravel 应用程序中,这是 web 守卫。

当用户通过应用程序 UI 发出第一方请求时,tokenCan 方法将始终返回 true。请记住,这并不一定意味着您的应用程序必须允许用户执行该操作。通常,您的策略将决定是否已授予令牌执行能力的权限,**以及检查用户实例本身是否应该被允许执行该操作**。

例如,在更新博客文章的情况下,这可能意味着检查令牌是否被授权更新文章,**以及**该文章是否属于该用户。

php
return $request->user()->id === $post->user_id &&
       $request->user()->tokenCan('post:update')

最初,允许 tokenCan 方法被调用并始终为第一方 UI 发起的请求返回 true 似乎很奇怪;但是,能够始终假设 API 令牌可用并可以通过 tokenCan 方法进行检查很方便。这意味着您始终可以在应用程序的授权策略中调用 tokenCan 方法,而无需担心请求是来自应用程序的 UI 还是由 API 的第三方使用者发起的。