laravel开发:如何使用laravel sanctum为spa提供api身份验证?
随着单页应用程序(SPA)的流行,我们需要一种可靠的方法来保护我们的API免受未经授权的访问和攻击。Laravel Sanctum是Laravel提供的一个轻量级的认证系统,它为SPA提供轻松的身份验证。本文将向您展示如何使用Laravel Sanctum为SPA提供API身份验证。
使用Laravel Sanctum
Laravel Sanctum是Laravel 7.x版本中的一个官方包,用于API身份验证。Laravel Sanctum使用该API的Token来识别用户身份,并且可以通过使用token轻松执行多个身份验证的构建。
安装Laravel Sanctum
要安装laravel sanctum,可以使用以下命令
1
composer require laravel/sanctum
将ServiceProvider添加到config/app.php文件的providers列表中。
1
2
3
4
5
providers => [
// ...
LaravelSanctumSanctumServiceProvider::class,
],
现在,可以运行以下命令发布必要的数据库迁移和Sanctum配置。
1
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
执行以下命令以运行迁移:
1
php artisan migrate
使用Sanctum进行默认身份验证
Sanctum包含API和单页应用程序身份验证的默认实现。可以通过为用户模型使用SanctumTraitsHasApiTokens trait来启用默认身份验证。
将HasApiTokens trait添加到用户模型
1
2
3
4
5
6
7
8
9
10
11
12
<?php namespace AppModels;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use LaravelSanctumHasApiTokens;
class User extends Authenticatable
{
use Notifiable, HasApiTokens;
// ...
}
为了更好的解释,我们将使用一个简单的SPA示例。假设示例的URL为http://spa.test和通过http://api.spa.test公开的API。
在Laravel中配置CORS
将下面的代码添加到app/Providers/AppServiceProvider.php文件中来允许跨域资源共享(CORS)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
...
use IlluminateSupportFacadesSchema;
use IlluminateSupportFacadesURL;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Schema::defaultStringLength(191);
if (config(app.env) === production) {
URL::forceScheme(https);
}
$headers = [
Access-Control-Allow-Origin => *,
Access-Control-Allow-Methods => POST, GET, OPTIONS, PUT, DELETE,
Access-Control-Allow-Headers => Origin, Content-Type, Accept, Authorization, X-Request-With,
Access-Control-Allow-Credentials => true,
];
$this->app[router]->middleware(api)->get(/sanctum/csrf-cookie, function () {
return response()->json([status => success]);
});
foreach ($headers as $key => $value) {
config([cors.supportsCredentials => true]);
config([cors.paths.api/* => [
allowedOrigins => [http://spa.test],
allowedHeaders => [$key],
allowedMethods => [*],
exposedHeaders => [],
maxAge => 86400,
]]);
}
}
}
将上述代码中的http://spa.test替换为您的SPA的URL。
令牌验证和API保护说明
在控制器中,我们可以使用Sanctum的auth中间件来保护路由
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public function index(Request $request)
{
$user = $request->user();
// ...
}
public function store(Request $request)
{
$user = $request->user();
// ...
}
public function destroy(Request $request, string $id)
{
$user = $request->user();
// ...
}
public function update(Request $request, string $id)
{
$user = $request->user();
// ...
}
这会从请求标头中获取Sanctum授权令牌,并使用该令牌验证用户。如果未在标头中提供授权令牌,则将返回401未经授权的错误。
发出授权令牌请求
在我们的SPA中,我们可以使用axios库来使用API并获取令牌。要获取授权令牌,我们需要首先获取CSRF令牌,所以我们需要发送一个GET请求来获取它。
1
2
3
4
5
6
7
8
9
axios.get(http://api.spa.test/sanctum/csrf-cookie).then(response => {
axios.post(http://api.spa.test/login, {
username: this.username,
password: this.password
}).then(response => {
axios.defaults.headers.common[Authorization] = `Bearer ${response.data.token}`;
this.$router.push({ name: home });
});
});
上面的代码将在http://api.spa.test中发出POST请求,在服务器上创建一个新的Sanctum授权令牌,并将令牌作为response.data.token进行响应。此后,我们可以将令牌添加到axios的通用头文件中,以在SPA中使用所有后续请求。
注意,此示例假设有一个名为“login”的路由。
Sanctum还为我们提供了一个logout路由来撤销授权令牌。
1
2
3
4
axios.post(http://api.spa.test/logout).then(response => {
delete axios.defaults.headers.common[Authorization];
this.$router.push({ name: login });
});
结论
Laravel Sanctum是一个轻量级的简单实用的身份验证系统,它易于集成和使用,并提供默认的身份验证功能,是SPA身份验证的绝佳解决方案。一旦您与Sanctum一起使用,您将不再需要编写自己的身份验证系统。它能够让我们为我们的API快速实现安全的身份验证,并让我们的SPA与API在很短的时间内交互。
以上就是Laravel开发:如何使用Laravel Sanctum为SPA提供API身份验证?的详细内容,更多请关注php中文网其它相关文章!