基于 Laravel Passport API 的多用户多字段认证系统(一):基础框架搭建

网上关于Laravel Passport的教程不少,实际业务需求需要用到多用户多字段登录,原生的Passport包已经无法满足需求。经过查找资料和阅读源码,以下演示基于Laravel 5.5框架全新搭建一套API多用户多字段认证的系统Demo

1. 基础框架搭建

1-1. 新建Laravel项目,我这里命名为 multiauth

composer create-project --prefer-dist laravel/laravel multiauth

1-2. 进入文件夹,引入Laravel Passport

composer require laravel/passport

1-3. 因为Laravel5.5自带了package discover, 因此无需按照文档中提及的将 Passport 的服务提供者注册到配置文件 config/app.php 的 providers。直接执行下一步即可:

php artisan migrate

1-4. 运行 passport:install 命令来创建生成安全访问令牌时所需的加密密钥,同时,这条命令也会创建用于生成访问令牌的「个人访问」客户端和「密码授权」客户端,。
请记住 Client ID: 2 对应的 Client Secret ,后续测试需要使用。

php artisan passport:install

1–5. 将 Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用范围:

<?php

namespace App;

use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

...

1–6. 在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 函数。这个函数会注册发出访问令牌并撤销访问令牌、客户端和个人访问令牌所必需的路由:

<?php

namespace App\Providers;

use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * 应用程序的策略映射。
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }
}

1–7. 将配置文件 config/auth.php 中授权看守器 guards 的 api 的 driver 选项改为 passport。此调整会让你的应用程序在在验证传入的 API 的请求时使用 Passport 的 TokenGuard 来处理:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

1–8. 创建UserTableSeeder,并且导入测试数据

<?php

use Illuminate\Database\Seeder;
use App\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        User::query()->truncate();
        User::create([
            'name' => 'usera',
            'email' => 'usera@gmail.com',
            'password' => bcrypt('userasecret')
        ]);
        User::create([
            'name' => 'userb',
            'email' => 'userb@gmail.com',
            'password' => bcrypt('userbsecret'),
        ]);
    }
}
composer dump-autoload

php artisan db:seed --class=UsersTableSeeder

1–9. 测试获取Token。记的把以下代码中的域名换成自己的测试环境域名,secret换成1–4里面 client_id=2 对应的 secret。
测试工具按自己习惯,此处使用curl。

curl --request POST \
  --url http://multiauth.test/oauth/token \
  --header 'accept: application/json' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data 'username=userb%40gmail.com&password=userbsecret&client_id=2&client_secret=记住的secret&grant_type=password&scope='

1–10. 如果以上的每一步操作都没错的话,应该可以看见以下的输出了

{“token_type”:”Bearer”,”expires_in”:31536000,”access_token”:”eyJ0e...",”refresh_token”:”def50...”}

基于 Laravel Passport API 的多用户多字段认证系统(二):多用户登录

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!