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. 执行

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

    1. Laravel\Passport\PassportServiceProvider::class,
  3. Passport 使用服务提供者注册内部的数据库迁移脚本目录,所以上一步完成后,你需要更新你的数据库结构。Passport 的迁移脚本会自动创建应用程序需要的客户端数据表和令牌数据表:

    地址:/vendor/laravel/passport/database/migrations
    坑:由于用户表的用户id为char(32),默认为自增id,这里四个表的用户id(user_id)类型需要进行修改为char(32)(如果设计到团队开发最好是新建修改字段类型的migration来修改用户id类型)

    1. $table->char('user_id',32);

    执行:

    1. php artisan migrate

    有些会报错“ Changing columns for table “oauth_auth_codes” requires Doctrine DBAL; install “doctrine/dbal”. ”,需要安装组件,执行如下命令

    1. composer require doctrine/dbal
  4. 接下来,你需要运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条 命令也会创建「私人访问」客户端和「密码授权」客户端:

    执行:

    1. php artisan passport:install
  5. 上面命令执行后,请将 Laravel\Passport\HasApiTokens Trait 添加到 App\Login 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用域:

    如果装了ideaHelp组件可以按ctrl追加进去看具体属性和功能
    由于使用了自建用户表,这里要将表名、主键类型、主键名、用户名重写

    1. <?php
    2. namespace App\Model;
    3. use Laravel\Passport\HasApiTokens;
    4. use Illuminate\Notifications\Notifiable;
    5. use Illuminate\Foundation\Auth\User as Authenticatable;
    6. class Login extends Authenticatable
    7. {
    8. use HasApiTokens, Notifiable;
    9. // 表名
    10. protected $table = 'data_login_info';
    11. // 主键
    12. protected $primaryKey = 'guid';
    13. // 主键类型
    14. protected $keyType = 'string';
    15. /**
    16. * 说明:自定义授权用户名(默认为email)
    17. *
    18. * @param $username
    19. * @return \Illuminate\Database\Eloquent\Model|null|static
    20. * @author 郭庆
    21. */
    22. public function findForPassport($username)
    23. {
    24. return CompanyLogin::where('username', $username)->first();
    25. }
    26. }
  6. 接下来,需要在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 、enableImplicitGrant、tokensCan、tokensExpireIn、refreshTokensExpireIn具体作用看注释。

    1. public function boot()
    2. {
    3. $this->registerPolicies();
    4. // 会注册一些在访问令牌、客户端、私人访问令牌的发放和吊销过程中会用到的必要路由
    5. Passport::routes();
    6. // 简化授权
    7. // Passport::enableImplicitGrant();
    8. // 定义令牌作用域
    9. Passport::tokensCan([
    10. 'place-orders' => 'Place orders',
    11. 'check-status' => 'Check order status',
    12. ]);
    13. // accessToken有效期
    14. Passport::tokensExpireIn(Carbon::now()->addDays(15));
    15. // accessRefushToken有效期
    16. Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
    17. }
  7. 最后,需要将配置文件 config/auth.php 中 api 部分的授权保护项( driver )改为 passport 。此调整会让你的应用程序在接收到 API 的授权请求时使用 Passport 的 TokenGuard 来处理:

    1. 'guards' => [
    2. 'web' => [
    3. 'driver' => 'session',
    4. 'provider' => 'login',
    5. ],
    6. 'api' => [
    7. 'driver' => 'passport',
    8. 'provider' => 'login',
    9. ],
    10. ],
    11. 'providers' => [
    12. 'login' => [
    13. 'driver' => 'eloquent',
    14. 'model' => App\Model\Login::class,
    15. ]
    16. ],
  8. 以上步骤完成之后,passport的安装就完成了,具体配置的修改根据自己的新建的用户表来进行修改配置。

  9. 明后天博主会出具体的令牌发放修改(二部曲)、整体实现api授权认证登录api整体流程(三部曲)尽请期待!

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

您的支持是对我最大的鼓励!