美文网首页Laravel
Laravel 的 API 认证系统 Passport 三部曲(

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

作者: GQ1994 | 来源:发表于2018-04-20 09:32 被阅读169次

    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整体流程(三部曲)尽请期待!
    
    
    > 本文博主**亲自**手码,手写不易,欢迎转载,**打赏**,转载请**注明出处**,否则后果自负!
        
        
    
    

    相关文章

      网友评论

      本文标题:Laravel 的 API 认证系统 Passport 三部曲(

      本文链接:https://www.haomeiwen.com/subject/daxakftx.html