- _nosay
记录一下实现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() 最终效果图
至此,服务端所有工作就完成了。