Laravel开发:如何使用Laravel Sanctum为SPA提供API身份验证?

发布时间 - 2023-06-13 00:00:00    点击率:

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添加到用户模型

为了更好的解释,我们将使用一个简单的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  # php  # 中间件  # csrf  # Token  # 数据库  # http  # 令牌  # 身份验证  # 可以使用  # 可以通过  # 如何使用  # 未经授权  # 应用程序  # 自己的  # 是一个  # 您的 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  java ZXing生成二维码及条码实例分享  ,南京靠谱的征婚网站?  微信公众帐号开发教程之图文消息全攻略  制作公司内部网站有哪些,内网如何建网站?  Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Laravel如何使用Sanctum进行API认证?(SPA实战)  浅述节点的创建及常见功能的实现  C语言设计一个闪闪的圣诞树  Android Socket接口实现即时通讯实例代码  Swift中swift中的switch 语句  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Python结构化数据采集_字段抽取解析【教程】  LinuxShell函数封装方法_脚本复用设计思路【教程】  🚀拖拽式CMS建站能否实现高效与个性化并存?  EditPlus中的正则表达式 实战(1)  详解Oracle修改字段类型方法总结  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  iOS UIView常见属性方法小结  如何用VPS主机快速搭建个人网站?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  Laravel如何升级到最新版本?(升级指南和步骤)  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在IIS中新建站点并配置端口与物理路径?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  海南网站制作公司有哪些,海口网是哪家的?  简单实现jsp分页  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何在Tomcat中配置并部署网站项目?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  如何在阿里云虚拟服务器快速搭建网站?  如何在IIS中新建站点并解决端口绑定冲突?  如何为不同团队 ID 动态生成多个独立按钮  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  如何快速查询域名建站关键信息?  Python高阶函数应用_函数作为参数说明【指导】  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Java类加载基本过程详细介绍  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Python进程池调度策略_任务分发说明【指导】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Internet Explorer官网直接进入 IE浏览器在线体验版网址