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浏览器在线体验版网址


为我们提供了一个logout路由来撤销授权令牌。