Laravel 的 API 认证系统 Passport 三部曲(一、passport安装+配置)
博主最近在搞app开发,但是用户的登录授权因为不能像web一样实用session驱动授权,这里我们使用Laravel 中的 Passport 实现 API 授权过程。Passport 基于 League OAuth2 server 实现。
坑:中文文档对授权的介绍不全,文档的例子都是基于laravel自带的user表来进行的设计开发,但是其用户表往往满足不了我们的需求,需要自己设计用户表,如何让自建的用户表去完美兼容auth认证,下文给你答案。
这里我的用户表为“login”表,主键为char(32)的guid(默认的user表主键为自增id),用户名为varchar(64)的username(默认的user表用户名为email)
安装
和普通的composer组件安装一样,按照文档一步一步来即可
-
执行
composer require laravel/passport
-
将 Passport 的服务提供者注册到配置文件 config/app.php 的 providers 数组中:
Laravel\Passport\PassportServiceProvider::class,
-
Passport 使用服务提供者注册内部的数据库迁移脚本目录,所以上一步完成后,你需要更新你的数据库结构。Passport 的迁移脚本会自动创建应用程序需要的客户端数据表和令牌数据表:
地址:/vendor/laravel/passport/database/migrations
坑:由于用户表的用户id为char(32),默认为自增id,这里四个表的用户id(user_id)类型需要进行修改为char(32)(如果设计到团队开发最好是新建修改字段类型的migration来修改用户id类型)$table->char('user_id',32);
执行:
php artisan migrate
有些会报错“ Changing columns for table "oauth_auth_codes" requires Doctrine DBAL; install "doctrine/dbal". ”,需要安装组件,执行如下命令
composer require doctrine/dbal
-
接下来,你需要运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条 命令也会创建「私人访问」客户端和「密码授权」客户端:
执行:
php artisan passport:install
-
上面命令执行后,请将 Laravel\Passport\HasApiTokens Trait 添加到 App\Login 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用域:
如果装了ideaHelp组件可以按ctrl追加进去看具体属性和功能
由于使用了自建用户表,这里要将表名、主键类型、主键名、用户名重写<?php namespace App\Model; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class Login extends Authenticatable { use HasApiTokens, Notifiable; // 表名 protected $table = 'data_login_info'; // 主键 protected $primaryKey = 'guid'; // 主键类型 protected $keyType = 'string'; /** * 说明:自定义授权用户名(默认为email) * * @param $username * @return \Illuminate\Database\Eloquent\Model|null|static * @author 郭庆 */ public function findForPassport($username) { return CompanyLogin::where('username', $username)->first(); } }
-
接下来,需要在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 、enableImplicitGrant、tokensCan、tokensExpireIn、refreshTokensExpireIn具体作用看注释。
public function boot() { $this->registerPolicies(); // 会注册一些在访问令牌、客户端、私人访问令牌的发放和吊销过程中会用到的必要路由 Passport::routes(); // 简化授权 // Passport::enableImplicitGrant(); // 定义令牌作用域 Passport::tokensCan([ 'place-orders' => 'Place orders', 'check-status' => 'Check order status', ]); // accessToken有效期 Passport::tokensExpireIn(Carbon::now()->addDays(15)); // accessRefushToken有效期 Passport::refreshTokensExpireIn(Carbon::now()->addDays(30)); }
7. 最后,需要将配置文件 config/auth.php 中 api 部分的授权保护项( driver )改为 passport 。此调整会让你的应用程序在接收到 API 的授权请求时使用 Passport 的 TokenGuard 来处理:
```
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'login',
],
'api' => [
'driver' => 'passport',
'provider' => 'login',
],
],
'providers' => [
'login' => [
'driver' => 'eloquent',
'model' => App\Model\Login::class,
]
],
```
8. 以上步骤完成之后,passport的安装就完成了,具体配置的修改根据自己的新建的用户表来进行修改配置。
9. 明后天博主会出具体的令牌发放修改(二部曲)、整体实现api授权认证登录api整体流程(三部曲)尽请期待!
> 本文博主**亲自**手码,手写不易,欢迎转载,**打赏**,转载请**注明出处**,否则后果自负!