记录一下实现laravel Passport 认证的过程(服务端篇)

2017-08-16 17:07:45

    首先需要在服务器搭建认证端,用来认证和管理token之用

    1.在控制台执行命令,安装passport包

composer require laravel/passport

    

    2.在config/app.php进行注册

Laravel\Passport\PassportServiceProvider::class,

    3.Passport 服务提供着为框架注册了自己的数据库迁移目录,所以在注册之后需要迁移数据库,Passport 迁移将会为应用生成用于存放客户端和访问令牌的数据表:

php artisan migrate

    4.运行完这个命令后,添加 Laravel\Passport\HasApiTokens trait 到 App\User 模型,该 trait 将会为模型类提供一些辅助函数用于检查认证用户的 token 和 scope:

<?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;
}

    5.接下来,你需要在 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
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

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

        Passport::routes();
    }
}

    6.最后,在配置文件 config/auth.php 中,需要设置 api 认证 guard 的 driver 选项为 passport。这将告知应用在认证输入的 API 请求时使用 Passport 的 TokenGuard:

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

    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],

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

    7.Passport 附带了 JSON API 以便用户创建客户端和私人访问令牌(access token)。不过,考虑到编写前端代码与这些 API 交互是一件很花费时间的事,Passport 还预置了 Vue 组件作为示例以供使用(或者作为自己实现的参考)。要发布 Passport Vue 组件,可以使用 vendor:publish 命令:

php artisan vendor:publish --tag=passport-components

    8.发布后的组件位于 resources/assets/js/components 目录下,组件发布之后,还需要将它们注册到 resources/assets/js/app.js 文件:

Vue.component(
    'passport-clients',
    require('./components/passport/Clients.vue')
);

Vue.component(
    'passport-authorized-clients',
    require('./components/passport/AuthorizedClients.vue')
);

Vue.component(
    'passport-personal-access-tokens',
    require('./components/passport/PersonalAccessTokens.vue')
);

    9.生成相应的控制器,以及视图文件

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class OauthController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth.admin:admin');
    }

    public function index()
    {

        return view('admin.oauth.index');

    }
    //
}
@include('layouts.admin.main_header')
<body class="gray-bg">
<div id="app">
    <div class="container">
        <div>
            <div>

                <h1 class="logo-name">H+</h1>

            </div>
            <h3>欢迎使用</h3>
            @include('flash::message')
            <!-- let people make clients -->
            <passport-clients></passport-clients>

            <!-- list of clients people have authorized to access our account -->
            <passport-authorized-clients></passport-authorized-clients>

            <!-- make it simple to generate a token right in the UI to play with -->
            <passport-personal-access-tokens></passport-personal-access-tokens>
        </div>
    </div>
</div>
@include('layouts.admin.main_footer')
<script src="{{ asset('admin/js/admin.refresh_captcha.js') }}"></script>
</body>
</html>

    因为博主没有用户中心,只能通过后台登陆,而passport是用auth中间间进行登陆的,所以必须要修改中间键才可以。修改vendor/laravel/passport/src/Http/Controllers中替换所有

$request->user()->getKey()

$request->user('admin')->getKey()

最终效果图

Selection_006.png


    至此,服务端所有工作就完成了。