首页 php框架 Laravel 使用 Laravel Sanctum 对 Vue 应用进行授权

使用 Laravel Sanctum 对 Vue 应用进行授权

May 20, 2020 am 11:35 AM
laravel php

使用 Laravel Sanctum 对 Vue 应用进行授权

Laravel Sanctum (以前称为 Laravel Airlock), 于今年早些时候发布,是一个轻量级的扩展包,可以使得在单页面应用或者本地移动应用上构建身份验证的流程变得尽可能地简单和轻松。在此之前,你要么使用基于 sessions 的 Web 中间件 ,要么使用外部集成的依赖包,如 Tymon 的 jwt-auth, 然而现在,你可以使用 Sanctum 来完成有状态的身份验证和基于 token 身份验证。

在这个简短的测试中,我会向你展示如何让运用 Laravel Sanctum 从 0 开始构建一个项目。 我们将创建一个虚拟 API,通过 Vue 组件对用户进行身份验证,并获取与该登录用户相关联的数据。

如果您想跳过书面教程,可以观看我制作的 视频

您也可以直接到 GitHub 上查看完整源代码,该源代码位于 [代码] this repository 。

准备就绪,接下来,让我们一起盘它!

创建测试 API

我们需要做的第一件事是创建一个可以从中获取数据的 API 接口。我构思了一个超级简单的应用,用于检索展示每个用户的秘密列表。

我已经安装了一个开箱即用的 Laravel 应用程序,并且将其跟 MySQL 数据库一起配置运行在我使用 Laravel Docker setup 搭建的本地环境中。我要做的第一件事就是去为我们的 secret 创建一个模型类以及相关的迁移文件 ,这里我们可以很轻松地使用 artisan , 通过命令行来完成这些操作。

php artisan make:model Secret --migration
登录后复制

接下来,让我们打开迁移文件,并且添加一些足以描述一个 secret 需要的数据列。 我认为我们需要的 (除了 Laravel 提供的默认 ID 和时间戳) 是一个用于跟用户关联的 user_id 整数字段 ,以及一个用于实实在在地保存用户 secret 信息的字段。

Schema::create('secrets', function (Blueprint $table) {
    $table->id();
    $table->integer('user_id');
    $table->text('secret');
    $table->timestamps();
});
登录后复制

然后,接着运行数据库迁移命令生成 users 和 secrets 两个表。

php artisan migrate
登录后复制

我们需要对应用程序的两个模型类进行一些简单的修改,用于启用两个模型类之间的关联关系,所以接下来让我们打开这两个模型类文件,并且开始修改 :

// User.php
public function secrets()
{
    return $this->hasMany('App\Secret');
}
// Secret.php
public function user()
{
    return $this->belongsTo('App\User');
}
登录后复制

我们 API 结构的最后一部分就是实际的路由和控制器。我们将仅仅访问一条网页路径就可以展示出跟当前用户的所有 secrets 信息。所以,我在 routes/api.php 文件中添加了以下内容:

Route::get('/secrets', 'SecretController@index');
登录后复制

可以使用 Artisan 命令轻松创建此控制器:

php artisan make:controller SecretController
登录后复制

打开刚刚创建的控制器,让我们创建 index 方法,先返回所有的密钥。因为 现在 我们还无法获得经过身份验证的用户:

public function index()
{
    return App\Secret::all();
}
登录后复制

我们的虚拟 API 现在已经完成,来创建一些假用户和密钥吧。

填充数据库

你可以轻松地直接进入数据库并手动填充用户,创建控制器和表单以供用户输入自己的数据,或者使用 Artisan tinker 来半自动创建用户。我将跳过这些方法,使用内置的 Laravel 工厂为我们的用户和密钥生成假数据。

Laravel 带有一个开箱即用的 UserFactory.php 类,用来生成假用户。我们将为密钥创建一个类似的工厂类。在终端中运行以下 Artisan 命令:

php artisan make:factory SecretFactory --model=Secret
登录后复制

打开生成的文件,我们只需用 user_id 和 secret 这两个数据填充每个模型:

$factory->define(Secret::class, function (Faker $faker) {
    return [
        'user_id' => 1,
        'secret' => $faker->text
    ];
});
登录后复制

你可能想知道为什么我们要在上面的片段中的 user_id 中使用硬编码。因为我不想基于用户数量随机生成它,而是希望对其进行更多控制。稍后,我将告诉你当我们开始生成秘密时如何覆盖它。

让我们从创建几个假用户开始。通过从站点根目录运行 php artisan tinker 命令来打开 Tinker Shell. 打开后,我们可以通过两次运行 global factory helper 来创建两个用户:

factory(App\User::class)->create(); // 与make不同,create 将我们的用户保存在数据库中
登录后复制

Now that we have them generated, let's create our secrets. I'm going to run the following in the tinker shell twice to create two for user_id 1:

现在我们已经生成了它们,让我们创建我们的密钥。我在 tinker 中运行以下命令两次,为 user_id 1 创建两个密钥:

factory(App\Secret::class)->create();
登录后复制

但是如果第二个密钥拥有不同 ID 的用户呢?覆盖工厂类中的任何值都很容易,我们要做的就是将覆盖数组传递给 create() 方法。因此,我们将运行两次以下命令,为第二个假用户创建两个密钥:

factory(App\Secret::class)->create(['user_id' => 2]);
登录后复制

我们的数据库中填充了足够的假数据之后,让我们继续安装和准备 Laravel Sanctum 软件包。

安装 Laravel Sanctum

安装轻而易举,可以通过在终端中运行一些命令来完成。首先,让我们使用 Composer 安装该软件包:

composer require laravel/sanctum
登录后复制

接下来运行以下命令发布迁移文件(并运行迁移):

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
登录后复制

Sanctum 安装的最后一部分要求我们修改 app\Http\Kernel.php 文件以包含一个中间件,该中间件会将 Laravel 的会话 cookie 注入到我们的应用程序前端中。这最终将使我们能够以经过身份验证的用户身份传递和检索数据:

'api' => [
    EnsureFrontendRequestsAreStateful::class,
    'throttle:60,1'
]
登录后复制

现在,我们可以进入应用程序的前端了!

构建前端

从 Laravel 7 开始,前端和身份验证模板已从主程序包中剥离,可以单独安装。为了进行演示,我们将使用它和 Vue 来构建前端。

在应用程序的根目录运行以下命令将帮助我们配置环境:

composer require laravel/ui
php artisan ui vue --auth
npm install && npm run dev
登录后复制

上面的命令做了三件事:

使用 Composer 安装 Laravel UI 软件包

生成 JS/UI 文件、身份验证模板和 package.json 修改

安装前端依赖项并编译开发环境的 JS/CSS 文件

我会把 welcome.blade.php 文件里的所有内容拷贝到 app.blade.php 文件里,然后把外部 div 里的内容删掉并添加一个 id="app" 属性。这将是我们 Vue 应用程序的挂载点,如刚才生成的 app.js 文件中所述。

让我们创建 Vue 组件,该组件将保存我们的登录表单并显示一些 secret.

创建 Vue 组件

在此之前,我们可以通过命令: php artisan ui vue 来生快速成我们的前端代码,它默认会生成一个 resources/js/components/ExampleComponent.vue 组件事例。好了,现在让我们创建新的组件:SecretComponent.vue,它的代码如下:

<template>
</template>
<script>
export default {
    data() {
        return {
            secrets: [],
            formData: {
                email: &#39;&#39;,
                password: &#39;&#39;
            }
        }
    }
}
</script>
登录后复制

这里有两个字段返回,其中 secrets 字段是个数组,还有一个用户存储 email 和 password 字段的 formData 对象。

下面,我们将在 template 标签内构件我们的登录表单。

<template>
    <div>
        <div v-if="!secrets.length" class="row">
            <form action="#" @submit.prevent="handleLogin">
                <div class="form-row">
                    <input type="email" v-model="formData.email">
                </div>
                <div class="form-row">
                    <input type="password" v-model="formData.password">
                </div>
                <div class="form-row">
                    <button type="submit">Sign In</button>
                </div>
            </form>
        </div>
    </div>
</template>
登录后复制

好了,一个登录表单创建完成,它可能看起来像下面这样:

微信截图_20200520113224.png

在上面代码中,我们禁用了 form 表单的默认提交操作,并将它移交给 Vue 的 Submit 来处里。现在我们创建 handleLogin 方法来处理用户的登录请求:

<script>
export default {
    data() {
        return {
            secrets: [],
            formData: {
                email: &#39;&#39;,
                password: &#39;&#39;
            }
        }
    },
    methods: {
        handleLogin() {
            // 处理登录请求
        }
    }
}
</script>
登录后复制

最后,不要忘记将我们的组件注册到 resources/js/app.js 文件中:

Vue.component(&#39;secret-component&#39;, require(&#39;./components/SecretComponent.vue).default);
登录后复制

然后在 app.blade.php 中使用该组件。现在我们可以通过 handleLogin() 方法验证用户登录操作了。

用户验证

如果看过 Laravel Sanctum documentation 这篇文章,你应该知道 SPA 单页应用的 csrf 保护实现方式,你需要先请求 /sanctum/csrf-cookie 以获取 csrf token。

然后,我们请求 /login 路由,并将我们的 email 和 password 字段传递给后端接口处理。

现在让我们在 handleLogin() 方法中实现上面的需求:

handleLogin() {
    axios.get(&#39;/sanctum/csrf-cookie&#39;).then(response => {
        axios.post(&#39;/login&#39;, this.formData).then(response => {
            console.log(&#39;登录成功!&#39;);
        }).catch(error => console.log(error)); // 如果验证不匹配
    });
}
登录后复制

现在,使用当我们输入相应的信息你会发现流程已经走通。每个请求都会受到 csrf 保护,并发送登录接口所需要的 email 与 password 字段,即使现在没有响应数据,我的程序依然会通过 Promise 继续执行,而不会崩溃。

接下来要做什么?让我们完成登录操作吧!

用户检索

在我们的 Vue 组件中,继续创建名为 getSecrets() 方法,该方法是用户登陆成功之后,获取用户 secrets ,通常我们会得到一个 secrets 数组,之后我们将我们的得到的新的数组替换组件中原有的数组。

打当用户登录成功之后,我们调用 getSecrets() 函数以完成后续操作。

handleLogin() {
    axios.get(&#39;/sanctum/csrf-cookie&#39;).then(response => {
        axios.post(&#39;/login&#39;, this.formData).then(response => {
            this.getSecrets();
        }).catch(error => console.log(error)); // credentials didn&#39;t match
    });
},
getSecrets() {
    axios.get(&#39;/api/secrets&#39;).then(response => this.secrets = response.data);
}
登录后复制

但是,现在程序中我们返回的是所有用户 secrets。所以我们需要在 index() 方修改它,以得到正确的数据:

public function index(Request $request)
{
    return $request->user()->secrets;
}
登录后复制

在登录成功之后,所有需要用户验证的接口中的请求头中都会包含 laravel_session cookie,这样 Sanctum 可以通过该 cookie 来确定并关联当前请求的用户。

之后,既可以使用 $request 对象来获取用户的全部信息了,然后我们将 secret 信息与用户关联,并将数据返回。

最后我们将数据格式化、脱敏之后呈现给用户:

<template>
    <div>
        <div v-if="secrets.length" class="row">
            <div class="secret" v-for="(secret, index) in secrets" :key="index">
                <strong v-text="secret.secret"></strong> - created at <span v-text="secret.created_at"></span>
            </div>
        </div>
    </div>
</template>
登录后复制

现在我们刷新应用,并使用我们 fake 的用户数据登录,就可以看到以下页面了:

微信截图_20200520113212.png

至此,一个 SPA 单页应用的登录操作完成。

总结和后续

我仅仅刚开始接触并使用该扩展,如果使用以上方式验证用户,则之后所有需要用户信息的接口可以实现像传统 web 应用的登录操作一样,每个请求都会携带用户状态。

当然,你也可以用 token 令牌的方式实现 SPA 单页应用的身份验证,移动以及桌面应用。俗话说的好条条大路通罗马。该文章只是围绕 documentation 该扩展展开的讨论与实践。

希望本文能给您的开发带来方便与启发。

推荐教程:《PHP教程

以上是使用 Laravel Sanctum 对 Vue 应用进行授权的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

我后悔之前不知道的 7 个 PHP 函数 我后悔之前不知道的 7 个 PHP 函数 Nov 13, 2024 am 09:42 AM

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

在 Laravel 中,如何处理邮件发送验证码失败的情况? 在 Laravel 中,如何处理邮件发送验证码失败的情况? Mar 31, 2025 pm 11:48 PM

Laravel邮件发送验证码失败时的处理方法在使用Laravel...

See all articles