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框架。
要安装laravel sanctum,可以使用以下命令
composer require laravel/sanctum
将serviceprovider添加到config/app.php文件的providers列表中。
'providers' => [ // ... laravelsanctumsanctumserviceprovider::class,],
现在,可以运行以下命令发布必要的数据库迁移和sanctum配置。
php artisan vendor:publish --provider="laravelsanctumsanctumserviceprovider"
执行以下命令以运行迁移:
php artisan migrate
使用sanctum进行默认身份验证
sanctum包含api和单页应用程序身份验证的默认实现。可以通过为用户模型使用sanctumtraitshasapitokens trait来启用默认身份验证。
将hasapitokens trait添加到用户模型
<?phpnamespace 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)。
...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中间件来保护路由
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请求来获取它。
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路由来撤销授权令牌。
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身份验证?的详细内容。