少了个令牌有效期内容
相关信息:
- 类型:文档文章
- 文章: Sanctum API 授权
- 文档: 《Laravel 9 中文文档(9.x)》
此投稿由 ojbkkk 在 2年前 合并。
标题修改:
内容修改:
Old | New | Differences |
---|---|---|
1 | ||
2 | 1 | # Laravel Sanctum |
3 | 2 | |
4 | 3 | - [介绍](#introduction) | … | … |
11 | 10 | - [令牌能力](#token-abilities) |
12 | 11 | - [保护路由](#protecting-routes) |
13 | 12 | - [撤销令牌](#revoking-tokens) |
13 | - [令牌有效期](#token-expiration) | |
14 | 14 | - [SPA 认证](#spa-authentication) |
15 | 15 | - [配置](#spa-configuration) |
16 | 16 | - [认证](#spa-authenticating) | … | … |
36 | 36 | #### API 令牌 |
37 | 37 | |
38 | 38 | 首先,它是一个简单的包,用于向用户发出 API 令牌,而不涉及 OAuth。这个功能的灵感来自 GitHub 的「访问令牌」。例如,假设应用程序的「帐户设置」有一个界面,用户可以在其中为其帐户生成 API 令牌。你可以使用 Sanctum 来生成和管理这些令牌。这些令牌通常有很长的过期时间(以年计),当然用户可以随时手动将其撤销。 |
39 | ||
40 | ||
39 | ||
40 | ||
41 | 41 | Laravel Sanctum 的这个特性是通过将用户 API 令牌存储在单个数据库表中,并通过包含了有效 API 令牌的 `Authorization` 标识头对传入的请求进行身份验证而实现的。 |
42 | 42 | |
43 | 43 | <a name="how-it-works-spa-authentication"></a> | … | … |
56 | 56 | |
57 | 57 | > 技巧:最新版本的 Laravel 已经包含了 Laravel Sanctum,但是,如果您的应用程序中 composer.json 文件里不包含 `"laravel/sanctum"` 的话,您可以按照下面的说明进行安装。 |
58 | 58 | |
59 | ||
60 | ||
59 | ||
60 | ||
61 | 61 | 您可以通过Composer软件包管理器安装Laravel Sanctum: |
62 | 62 | |
63 | 63 | ```shell | … | … |
118 | 118 | Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); |
119 | 119 | } |
120 | 120 | |
121 | ||
122 | ||
121 | ||
122 | ||
123 | 123 | <a name="api-token-authentication"></a> |
124 | 124 | ## API 令牌认证 |
125 | 125 | … | … |
162 | 162 | |
163 | 163 | return $user->createToken('token-name', ['server:update'])->plainTextToken; |
164 | 164 | |
165 | ||
166 | ||
165 | ||
166 | ||
167 | 167 | 在处理由 Sanctum 验证的传入请求时,你可以使用 `tokenCan` 方法确定令牌是否具有给定的能力: |
168 | 168 | |
169 | 169 | if ($user->tokenCan('server:update')) { | … | … |
197 | 197 | |
198 | 198 | 但是,这并不一定意味着你的应用必须允许用户执行操作。通常,你的应用的 [授权策略](/docs/laravel/9.x/authorization#creating-policies) 将确定令牌是否已被授予执行能力的权限,并检查是否应允许用户实例本身来执行操作。 |
199 | 199 | |
200 | ||
201 | ||
200 | ||
201 | ||
202 | 202 | 例如,假设我们有一个管理服务器的应用,那就要检查令牌是否有权更新服务器 **和** 服务器是否属于用户: |
203 | 203 | |
204 | 204 | ```php | … | … |
221 | 221 | return $request->user(); |
222 | 222 | }); |
223 | 223 | |
224 | ||
225 | ||
224 | ||
225 | ||
226 | 226 | <a name="revoking-tokens"></a> |
227 | 227 | ### 撤销令牌 |
228 | 228 | … | … |
237 | 237 | // 撤销指定令牌... |
238 | 238 | $user->tokens()->where('id', $tokenId)->delete(); |
239 | 239 | |
240 | <a name="token-expiration"></a> | |
241 | ### 令牌有效期 | |
242 | ||
243 | 默认情况下,`sanctum` 的`token`无过期时限并且仅能通过[撤销令牌](#revoking-tokens)来使它无效。当然如果您想在您的程序里设置`token`的有效期也是可以的。修改`sanctum`的配置文件中的`expiration`选项(默认为null),此选项设置的数字表示多少分钟后过期: | |
244 | ||
245 | // 365天后过期 | |
246 | 'expiration' => 525600, | |
247 | ||
248 | 如果您的程序中配置了`token`的过期时间,那您多半会希望能用[任务调度](/docs/laravel/9.x/scheduling)自动删除过期了的`token`数据。有个好消息,`sanctum` 提供了一个`Artisan`命令,可以实现这个想法: | |
249 | ```sh | |
250 | php artisan sanctum:prune-expired | |
251 | ``` | |
252 | 比如,您可以设置一个调度任务用于删除你数据库中所有过期超过24小时的`token`记录: | |
253 | ||
254 | $schedule->command('sanctum:prune-expired --hours=24')->daily(); | |
255 | ||
240 | 256 | <a name="spa-authentication"></a> |
241 | 257 | ## SPA 认证 |
242 | 258 | … | … |
256 | 272 | |
257 | 273 | > 注意:如果你通过包含端口 (`127.0.0.1:8000`)的 URL 访问应用程序,则应确保在域中包含端口号。 |
258 | 274 | |
259 | ||
260 | ||
275 | ||
276 | ||
261 | 277 | <a name="sanctum-middleware"></a> |
262 | 278 | #### Sanctum 中间件 |
263 | 279 | … | … |
292 | 308 | <a name="csrf-protection"></a> |
293 | 309 | #### CSRF 保护 |
294 | 310 | |
295 | ||
296 | ||
311 | ||
312 | ||
297 | 313 | 要验证你的 SPA,你的 SPA 的 「登录」页面应首先向 `/sanctum/csrf-cookie` 发出请求以初始化应用程序的 CSRF 保护: |
298 | 314 | |
299 | 315 | ```js | … | … |
315 | 331 | |
316 | 332 | > 注意:你可以自由编写自己的 `/login` 端点;但是,你应该确保它使用标准的 [Laravel 提供的基于 session 的身份验证服务](/docs/laravel/8.x/authentication#authenticating-users) 对用户进行身份验证。通常,这意味着使用 「web」身份验证看守器。 |
317 | 333 | |
318 | ||
319 | ||
334 | ||
335 | ||
320 | 336 | <a name="protecting-spa-routes"></a> |
321 | 337 | ### 路由保护 |
322 | 338 | … | … |
367 | 383 | |
368 | 384 | 你可以使用 Sanctum 令牌来验证你的移动应用程序对 API 的请求。验证移动应用请求的过程类似于验证第三方 API 请求;但是,在发布 API 令牌的方式上存在细微差别。 |
369 | 385 | |
370 | ||
371 | ||
386 | ||
387 | ||
372 | 388 | <a name="issuing-mobile-api-tokens"></a> |
373 | 389 | ### 发行 API 令牌 |
374 | 390 | … | … |
412 | 428 | return $request->user(); |
413 | 429 | }); |
414 | 430 | |
415 | ||
416 | ||
431 | ||
432 | ||
417 | 433 | <a name="revoking-mobile-api-tokens"></a> |
418 | 434 | ### 撤销令牌 |
419 | 435 | … | … |
451 | 467 | User::factory()->create(), |
452 | 468 | ['*'] |
453 | 469 | ); |
470 | ||
454 | 471 | |
455 |