「 原创 」Laravel 5.8 API 开发实战(四)
bigegpt 2024-10-18 04:21 5 浏览
《Laravel 5.8 API 开发实战(二)》《Laravel 5.8 API 开发实战(三)》主要讲述了 Jwt-Auth 的基本实现及无感刷新 Token,本篇主要讲述 API 守护 Passport,密码授权令牌的实现。
安装 Passport
用 composer 安装 passport,运行 composer require laravel/passport
安装完成后,passport 服务提供器会自动使用框架注册自己的数据库迁移目录,只需要运行 php artisan migrate 即可。
当然了,如果不想使用 passport 的默认迁移,可以在 AppServiceProvider 的 register 方法中调用忽略迁移的方法 Passport::ignoreMigrations
生成密钥
运行 php artisan passport:install,该命令会生成安全访问令牌时所需要的加密密钥
更新模型
上述命令执行完成,生成密钥后,需要将 Trait 添加到 APP/User 模型中,提供一些需要的辅助函数。
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* 通过用户名/手机号码找到对应的用户信息
*
* @param string $username
* @return User
*/
public function findForPassport($username) {
return $this->orWhere('username', $username)->orWhere('email', $username)->orWhere('phone', $username)->first();
}
}
服务提供器(Provider)
在 app/Providers 目录下,修改 AuthServiceProviders.php 中的 boot 方法,调用 Passport::routes 函数,这个函数会注册一些必须的路由(发出 / 撤销 访问令牌(客户端 / 个人)等)
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
授权看守器(Guard)
修改配置文件 config/auth.php 中 api 的授权看守器 gurads,将 driver 选项改为 passport。
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
]
token 有效期
Passport 颁发的访问令牌,默认是一年有效的,如果想自定义访问令牌的有效期,可使用 tokensExpireIn 及 refreshTokensExpireIn 方法去设置(app/Providers/AuthServiceProvider.php)
public function boot() {
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(now()->addDays(10));
Passport::refreshTokensExpireIn(now()->addDays(30));
}
部署 passport
运行:php artisan passport:keys (该命令会生成 Passport 生成访问令牌所需的密钥)
密码授权令牌
OAuth2 密码授权机制,可以非常方便自己的客户端通过手机号码(或邮箱)+ 密码的形式,进行授权,获取访问令牌,无需遍历整个OAuth2 整个授权流程。
密码授权客户端
如果此前安装 passport 时,执行过 php artisan passport:install 命令的,将无需执行下面的命令,因为该指令已经生产两条数据,即生成了对应的客户端,具体可以查看 oauth_client 数据表。
若是未执行上述命令,可执行:php artisan passport:client --password ,对应的输入想要的用户名即可。
请求令牌
客户端创建后,就可以通过电子邮件地址与密码向 /oauth/token 发 POST 请求了,需要注意的是,该路由已经通过 Passport::routes 注册过,无需另外手动注册,如果请求成功,则会返回如下所示的 JSON 对象,包含 token_type(类型),expires_in(过期时间),access_token 及 refresh_token
{
"token_type": "Bearer",
"expires_in": 1296000,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjQxOTI0MWIyMTYyMDkwMGEzMjBhZjVjZWUxNjgzYzkwZTE2Y2NiOTcyMzE3MzU4NzRiNmNkNTgxNTZjNzY3YzhlNjJiMjNlNWJkYzdjZDM1In0.eyJhdWQiOiI0IiwianRpIjoiNDE5MjQxYjIxNjIwOTAwYTMyMGFmNWNlZTE2ODNjOTBlMTZjY2I5NzIzMTczNTg3NGI2Y2Q1ODE1NmM3NjdjOGU2MmIyM2U1YmRjN2NkMzUiLCJpYXQiOjE1NTY1Mjk4NjUsIm5iZiI6MTU1NjUyOTg2NSwiZXhwIjoxNTU3ODI1ODY1LCJzdWIiOiIxIiwic2NvcGVzIjpbIioiXX0.ng5lmGdiwRGOxYRkW7R0Ox7VSb5pWIlRaxMbWikbIP0GyEhL4ABJjvA4LVNb8k0molnghbTrUxr8V9yNTI-dVzt8iNzEXEvQ2N_jBWL-96M85V_QybDq0nHMU5vdPqxbbcjZNoAz53GD-QQPpwlaT6X1IpjjkAcXKwY_SBywGG3LSeaYEVO9GhcSjEG27BDFdYHHWD6C-gJwt1IsZ5ggfgxsC3vakfay3aQbRaoQycvk_lYzJA-xwcqJodOx6OkeSPm64Whq2njbyQ4YRUsvLo6DbWm5bZ6vVd4INTetwJErjMMn6XMcHp3Oont6UetuMeg_VdhPcnI58ew1DjbDAlpBk-B5z-MAMxPrhQYLFgsqOU8YdSQD4ddTD7OW9NUyjvNqcQAvoJIYfUCsGw3hTG9VXG7TyJQJQ_I5oq7_5gHLcuaHJn5Pzfq47Tql88UnoQZKSw4FcfEDP7uXNXAdg5edc4wnog8LMeIa6WqYXfnjy5rIjLnhJcq-6Ot4KIOVjNL3teDLCe9A7fv7tdLSJiCf4Pz-jEjRS_Z0pdHdwyFihUWcl578JKHAHlj4B0CY9zXSmTdNeY-LofKP1vaFX8Ct6sQsYOJB-O3oOqfxeVHNRYD6liPWnLcFmyBFR9qV-XpSCR-PnxwBUJ9s0v_tCpHfwDMO6T8jf72OxZ-H8IA",
"refresh_token": "def502005aa00689b542002eb9f23e83351ffeb309d6b804023b533804d36652ad1a8458fe7bf14e25043b28c2b842938dd6b056202bddd568d6bdccdd000d913c76cfd281b7a1df56675c4f04f56f4b63b68011d13a5e363bf64de44931faabf22b672f63cbe215f664f52c1830d217f39c3688adaec49f97f95652777e9f4bab5184c6d51c0ae93ad0f3b64c01c0b22bc67c577c6fa9a4247a8865a6eae9b3f37d1c496e9274e4ae6bb01e830461bde27e562f3a31f420bd34cb1d30456336c85cc40dcf8290b74d7661ade84efe81cfa3fc623c78bb3f6ca385dcc60278e6be10c9127206ca55144f7d419e87b89e19d48e159b790d66d3d65860dacc87f7b9806e770eff8436c87c18cdfa75a2e4e7cc1430876b78f647608189214fc2daa465758e6c51909a08bd1aa868978821144b74f65a124d84195d1b0cbafdbca9c664ac082b1f2bd14aa728d740a7b17073413db6af179940d79de0b43ada6f01ee56795a"
}
请求令牌过程中有几个需要注意的点:
1 - 采用 postman 之类的工具请求时,用 application/x-www-form-urlencode,即 form data 形式提交,否则会返回 unsupported_grant_type 的错误。
2 - 如果出现 invalid_credentials 错误,修改提交参数,默认未修改的情况下,username 值使用电子邮件地址,即类似以 makeit@makeit.vip 作为 username 的值 ( 当然,可以自定义用户名字段, 查看上面所述中《更新模型》这一块的内容 )
3 - 该方式,默认情况下,发放的访问令牌是长期有效的,如果需要修正时间,请查看 《Laravel 5.8 API 开发实战(三)》
请求作用域
使用密码授权机制时,请求参数中若携带了 scope 参数,且值为 * 的话,令牌实例中的 can 方法将一直都返回 true 的状态;这种作用域的授权只能分配给使用 password 授权的令牌。
颁发访问令牌
使用授权码时,客户端的应用程序会将用户重定向我们的授权服务器,授权服务器返回信息进行询问用户,是批准还是拒绝该客户端访问授权令牌(如果对于OAuth的授权流程不清楚的话,可以查看阮一峰《关于 OAuth2.0 的理解》的日志)
管理客户端
很显然,为了方便测试 OAuth2.0 的功能,我们需要生成一个 [ 客户端 ] 来注册自己的应用程序,完成整个授权流程, php artisan passport:client,该命令会创建一个客户端(第三方或用户是无法使用 client 命令的,此处是为了方便测试)。
如上图所示,为这个客户端分配了 user 表中 id = 1 的用户;若该 user 表为空的话,可以运行如下命令完成用户创建。
php artisan tinker
App\User::create(['name' => 'makeit', 'email' => 'makeit@makeit.vip', 'password' => bcrypt('123456')]);
虽然用户或者第三方无法使用 client 命令进行客户端创建,但是 Laravel 提供了一系列的接口,我们也就不用费时费事的去编写控制器来操作了,当然,要管理这些客户端,还是需要添加,删除等相关的管理页面的;此处我们为了方便测试,就不进行页面展示了,我们只用 postman,resetlet 等工具来进行接口测试,但是这些 API 由 web 与 auth 两个中间件的保护,正常情况下只能从应用程序内部进行调用,外部是不允许调用的,所以需要进行一些准备工作的,本篇就说一下跨域问题的解决,其它的准备工作就先不赘述了。
CORS 跨域
composer require barryvdh/laravel-cors,执行该命令,安装 laravel-cors
config/app.php 文件内的 alials 中,添加如下内容,注册相应的服务:
'CROS' => Barryvdh\Cors\HandleCors::class
修改 app/Http/Kernel.php 文件,此处可分全局和局部使用两种方式,全局使用则将该服务添加到 $middleware 内容中,局部的则添加至 $middlewareGroups 中的 web / api 中都可以。
<?php
namespace App\Http;
use Barryvdh\Cors\HandleCors;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel {
protected $middleware = [
......
HandleCors::class
];
......
}
执行 php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider" 发布 cors 的配置。
发布配置后,在 config 目录下生成了 cors.php 配置文件,可以在 allowedHeaders 自定义 header,比如 Content-Type,X-Requested-With。白名单或者确定可访问的域名,在 allowedOrigins 添加即可,自行配置。
至此,oAuth 2.0 密码授权令牌的实现就完成了,另外还讲述了相关的客户端管理及其跨域的一些问题,三四篇下来,基本上 API 开发的起步工作算是完成了,从最初《Laravel 5.8 API 开发实战(一)》跑通无授权的接口,至《Laravel 5.8 API 开发实战(二)》实现 jwt-auth 的认证,再到《Laravel 5.8 API 开发实战(三)》实现无感刷新 token,再到当前实现 oAuth 2.0 密码授权,总结整理了 API 开发的前期准备工作,后续将结合开发实际,说说具体的功能点,比如采用 RabbitMQ,结合 QQ 邮箱,实现注册的邮件的异步发送,加快响应速度之类的 ......
相关推荐
- 得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践
-
一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...
- warm-flow新春版:网关直连和流程图重构
-
本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...
- 扣子空间体验报告
-
在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...
- spider-flow:开源的可视化方式定义爬虫方案
-
spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...
- solon-flow 你好世界!
-
solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...
- 新一代开源爬虫平台:SpiderFlow
-
SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...
- 通过 SQL 训练机器学习模型的引擎
-
关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...
- 鼠须管输入法rime for Mac
-
鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...
- Go语言 1.20 版本正式发布:新版详细介绍
-
Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...
- iOS 10平台SpriteKit新特性之Tile Maps(上)
-
简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...
- 程序员简历例句—范例Java、Python、C++模板
-
个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...
- Telerik UI for iOS Q3 2015正式发布
-
近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...
- ios使用ijkplayer+nginx进行视频直播
-
上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...
- IOS技术分享|iOS快速生成开发文档(一)
-
前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...
- macOS下配置VS Code C++开发环境
-
本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- dockernetworkconnect (63)
- esxi7 (63)
- vue阻止冒泡 (67)
- c#for循环 (63)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- java大写转小写 (63)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)