终于可以开始本篇 Laravel 教程了;
如果对 OAuth 和 JWT 还不是很了解;
建议先出门左转阅读上面链接中的系列文章;
我们先来回顾一下之前讲的 OAtuh 的四个角色;
- 资源服务器(resource server):github 服务器
- 授权服务器(authorization server):github 服务器
- 资源所有者(resource owner):用户你
- 客户端(client):第三方白俊遥博客
资源服务器(resource server)和授权服务器(authorization server)我们统称为 server ;
server 提供 OAuth 的认证服务;
client 则是使用 OAauth 服务;
在 PHP 社区中有一个以开发高质量扩展包著称的组织 league ;
他们提供了两个扩展包 oauth2-server 和 oauth2-client ;
分别实现了 server 和 client 服务;
Laravel 官方在 oauth2-client 的基础上开发了 socialite 用于实现 OAuth 第三方登录功能;
在 oauth2-server 基础上开发了 Passport 用于实现 OAuth 的认证服务;
Passport 提供了以下功能:
- 管理 clients
- OAuth 的四种授权类型
- 个人访问令牌 (personal access tokens)
- 管理令牌作用域 (scope)
铺垫完毕下面正式进入 Passport 环节;
Passport 默认没有安装;
使用前需要先 require 引入包;
composer require laravel/passport
Bash
Copy
运行迁移生成表:
php artisan migrate
Bash
Copy
迁移命令会生成如下表:
表名 | 作用 |
oauth_clients | 管理 clinet , 对应于前面的例子中的 白俊遥博客 |
oauth_auth_codes | 管理授权码模式 (Authorization Code) 中的 code |
oauth_access_tokens | 管理用于认证的 access_token |
oauth_refresh_tokens | 管理用于刷新 access_token 的 refresh_token |
oauth_personal_access_clients | 用于 personal access token |
Passport 提供了 3 个命令;
- 生成用于加密的 key
php artisan passport:keys
Bash
Copy
执行后会在 storage
目录下生成 key 文件;
- 创建 Client 的命令
php artisan passport:client
Bash
Copy
- 生成 key 并创建一个密码类型的 client 和个人令牌
这个命令是组合调用了上面的命令1 + 命令2
php artisan passport:install
Bash
Copy
我们这里执行安装命令:
php artisan passport:install
Bash
Copy
接着需要把 Laravel\Passport\HasApiTokens
Trait 添加到 App\User
模型中;
app/User.php
<?php namespace App; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable, HasApiTokens; // ... }
PHP
Copy
在 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 { //.. public function boot() { $this->registerPolicies(); Passport::routes(); } // ... }
PHP
Copy
这一步主要是注册路由的;
我们可以通过 route:list
命令查看注册的路由;
如果我们有需要修改这些方法的时候;
我们可以在 routes/api.php 覆盖这些路由即可;
最后一步配置把 config/auth.php 中 guards 的 api 的 driver 选项改为 passport ;
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
PHP
Copy
Passport 还提供了 vue 前端组件;
php artisan vendor:publish --tag=passport-components
Bash
Copy
在 resources/js/app.js 文件中注册组件;
resources/js/app.js
// ... Vue.component( 'passport-clients', require('./components/passport/Clients.vue').default ); Vue.component( 'passport-authorized-clients', require('./components/passport/AuthorizedClients.vue').default ); Vue.component( 'passport-personal-access-tokens', require('./components/passport/PersonalAccessTokens.vue').default ); // ...
JavaScript
Copy
这里写一个管理 Client 的页面;
routes/web.php
// ... Route::view('clients', 'clients');
PHP
Copy
resources/views/clients.blade.php
@extends('layouts.app') @section('content') <passport-clients></passport-clients> @endsection
HTML
Copy
访问 /clients
路由创建测试 Client ;
创建 Client 需要在登录状态下;
这里可以使用 Laravel 的用户认证模块;
php artisan make:auth
Bash
接下来就是 OAuth 的 4 种类型了;
Passport 的流程都是标准的 OAuth ;
只是有些请求参数会稍微不同;
这里就不赘述了;
Passport 的 token 使用的是 JWT 格式;
简单提一点的是这个 JWT 中是有一个用户 id 的 ;
如果你的系统中需要加密用户 id 的话;
除了标准的 OAuth 的 4 种类型;
Passport 还提供了个人访问令牌功能;
如果对 个人访问令牌不了解的话;
我们再次拿出之前举的例子:
OAtuh 的四个角色;
- 资源服务器(resource server):github 服务器
- 授权服务器(authorization server):github 服务器
- 资源所有者(resource owner):用户你
- 客户端(client):第三方白俊遥博客
在讲 OAuth 的时候一直都是 github 和白俊遥博客在操作;
那作为资源所有者的你如果也想使用 token 访问你自己的资源;
这时候就可以使个人访问令牌功能了;
个人访问令牌是没有过期时间的;
自然也就没有刷新 token 的功能;
Passport 同样提供了前端组件;
跟之前的管理 Clients 一样;
这里就业不再啰嗦了;