Laravel

Laravel 的 API 认证系统 Passport 三部曲(

2018-04-20  本文已影响169人  GQ1994

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组件安装一样,按照文档一步一步来即可

  1. 执行

    composer require laravel/passport
    
  2. 将 Passport 的服务提供者注册到配置文件 config/app.php 的 providers 数组中:

    Laravel\Passport\PassportServiceProvider::class,
    
  3. 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
  1. 接下来,你需要运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条 命令也会创建「私人访问」客户端和「密码授权」客户端:

    执行:

    php artisan passport:install
    
  2. 上面命令执行后,请将 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();
        }
    
    }
    
    
  3. 接下来,需要在 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整体流程(三部曲)尽请期待!


> 本文博主**亲自**手码,手写不易,欢迎转载,**打赏**,转载请**注明出处**,否则后果自负!
    
    

上一篇 下一篇

猜你喜欢

热点阅读