- _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()
最终效果图
至此,服务端所有工作就完成了。