安装passport
安装完成后,passport 做事供应器会自动利用框架注书籍身的数据库迁移目录,只须要运行 php artisan migrate 即可。
当然了,如果不想利用 passport 的默认迁移,可以在 AppServiceProvider 的 register 方法中调用忽略迁移的方法 Passport::ignoreMigrations
(图片来自网络侵删)注册数据表
天生密钥
运行 php artisan passport:install,该命令会天生安全访问令牌时所须要的加密密钥
天生密钥
更新模型
上述命令实行完成,天生密钥后,须要将 Trait 添加到 APP/User 模型中,供应一些须要的赞助函数。
做事供应器(Provider)
<?phpnamespace 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(); }}
在 app/Providers 目录下,修正 AuthServiceProviders.php 中的 boot 方法,调用 Passport::routes 函数,这个函数会注册一些必须的路由(发出 / 撤销 访问令牌(客户端 / 个人)等)
授权看守器(Guard)
<?phpnamespace 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(); }}
修正配置文件 config/auth.php 中 api 的授权看守器 gurads,将 driver 选项改为 passport。
token 有效期
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ],]
Passport 颁发的访问令牌,默认是一年有效的,如果想自定义访问令牌的有效期,可利用 tokensExpireIn 及 refreshTokensExpireIn 方法去设置(app/Providers/AuthServiceProvider.php)
支配 passport
public function boot() { $this->registerPolicies(); Passport::routes(); Passport::tokensExpireIn(now()->addDays(10)); Passport::refreshTokensExpireIn(now()->addDays(30));}
运行: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"}
POST要求成功后的返回
要求令牌过程中有几个须要把稳的点:
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 开拓实战(三)》
unsupported_grant_type 缺点
invalid_credentials 缺点
要求浸染域
利用密码授权机制时,要求参数中若携带了 scope 参数,且值为 的话,令牌实例中的 can 方法将一贯都返回 true 的状态;这种浸染域的授权只能分配给利用 password 授权的令牌。
颁发访问令牌利用授权码时,客户真个运用程序会将用户重定向我们的授权做事器,授权做事器返复书息进行讯问用户,是批准还是谢绝该客户端访问授权令牌(如果对付OAuth的授权流程不清楚的话,可以查看阮一峰《关于 OAuth2.0 的理解》的日志)
管理客户端很显然,为了方便测试 OAuth2.0 的功能,我们须要天生一个 [ 客户端 ] 来注书籍身的运用程序,完玉成部授权流程, php artisan passport:client,该命令会创建一个客户端(第三方或用户是无法利用 client 命令的,此处是为了方便测试)。
如上图所示,为这个客户端分配了 user 表中 id = 1 的用户;若该 user 表为空的话,可以运行如下命令完成用户创建。
php artisan tinkerApp\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
安装 laravel-cors
config/app.php 文件内的 alials 中,添加如下内容,注册相应的做事:
'CROS' => Barryvdh\Cors\HandleCors::class
修正 app/Http/Kernel.php 文件,此处可分全局和局部利用两种办法,全局利用则将该做事添加到 $middleware 内容中,局部的则添加至 $middlewareGroups 中的 web / api 中都可以。
<?phpnamespace 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 邮箱,实现注册的邮件的异步发送,加快相应速率之类的 ......