📅  最后修改于: 2023-12-03 15:32:33.770000             🧑  作者: Mango
本文将介绍如何使用 Laravel Sanctum 和 Axios 在前后端分离的应用中进行未经过身份验证的请求。Laravel Sanctum 是一个轻量级的认证库,可用于在 Laravel 应用程序中运行几乎所有类型的身份验证。Axios 是一个流行的 HTTP 客户端库,它允许在浏览器和 Node.js 中进行 HTTP 请求。
在进行任何未经过身份验证的请求之前,需要先对用户进行身份验证。在 Laravel Sanctum 中,可以使用以下方法:
使用任何支持凭据的方法,例如用户名和密码,来验证用户。然后,使用 Laravel Sanctum 生成一个 API 令牌。在生成令牌后,可以将其存储在本地存储或 cookie 中。
如果您已经有了应用程序的用户系统,并且每个用户都有一个唯一的 API 令牌,则可以使用此方法。在 Laravel Sanctum 中,可以使用以下方法生成 API 令牌:
$user->createToken('name')->plainTextToken;
此方法将在用户上创建一个新的 API 令牌,并返回一个可读的、明文的 API 令牌字符串。请注意,这些令牌是一次性的,且不能被重复使用。
Axios 是一个常用的 HTTP 客户端库,可以在浏览器和 Node.js 中使用。
在使用 Axios 之前,请先确保是否已经在应用程序中安装并注册过。如果您还没有安装,可以通过以下命令安装:
npm install axios
在使用 Axios 时,需要先配置 baseURL 以指向您应用程序的 API 地址。这是一个全局配置,您只需要配置一次即可:
import axios from 'axios';
axios.defaults.baseURL = 'http://api.example.com';
此外,您还需要确保发送请求的 HTTP 方法在 Laravel 应用程序中已启用。例如,如果您要使用 GET 方法进行请求,则需要在 app/Http/Kernel.php
文件中的 $middlewareGroups
属性中添加 api
验证中间件:
protected $middlewareGroups = [
// ...
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
现在,您可以使用 Axios 来发送请求。以下示例演示如何使用 Axios 发送一个 GET 请求:
axios.get('/api/users')
.then(response => {
console.log(response.data);
})
.catch(error => {
console.log(error.response);
});
在某些情况下,您可能需要在不进行身份验证的情况下发送请求。例如,在您的应用程序的某些页面或组件中,如果没有身份验证,可能需要显示有限数据。在 Laravel Sanctum 中,可以使用以下方法来处理未验证请求:
Laravel Sanctum 在其 CSRF 保护中使用了一个桶策略来针对内部 API 路由。当请求进入时,它将被分配给一个桶,该桶由作用域和加密以后的请求路径生成。如果请求是从前端发起的,它将分配给存储在样式、脚本或 URL 参数中的奇数桶(working_bucket
),如果请求是来自 API 客户机,则将分配给偶数桶(backup_bucket
)。如果任何请求到达桶,则桶被清空,并且该请求被允许。如果在请求到达之前有一段时间没有请求到达该桶,则该桶将被清空。
如果您需要在前端发起未验证的请求,则需要向 Laravel Sanctum 发送一个名为 X-Requested-With
的请求头,并将其设置为 XMLHttpRequest
:
axios.get('/api/users', {
headers: {
'X-Requested-With': 'XMLHttpRequest'
}
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.log(error.response);
});
在某些情况下,您可能需要在后台应用程序中添加一些公共路由,以供未经身份验证的用户访问。在 Laravel Sanctum 中,可以使用以下方法创建未经身份验证的路由:
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
Route::middleware(EnsureFrontendRequestsAreStateful::class)
->get('/api/public', function () {
return response()->json(['message' => 'Public API']);
});
在此示例中,我们使用 EnsureFrontendRequestsAreStateful
中间件,以确保请求是从前端发起的。此外,还可以使用其他中间件,例如 throttle
,来限制请求率等。
本文介绍了如何使用 Laravel Sanctum 和 Axios 在前后端分离的应用中进行未经过身份验证的请求。我们讨论了身份验证、Axios、未经身份验证的请求和一些其他相关主题。希望这篇文章能够帮助您进一步深入学习 Laravel Sanctum 和 Axios。