最適合入門的Laravel中級教程(五)Passport OAuth認證

經過前面 OAuth 系列JWT(JSON Web Token) 的鋪墊;
終于可以開始本篇 Laravel 教程了;
如果對 OAuth 和 JWT 還不是很了解;
建議先出門左轉閱讀上面鏈接中的系列文章;

我們先來回顧一下之前講的 OAtuh 的四個角色;

  1. 資源服務器(resource server):github 服務器
  2. 授權服務器(authorization server):github 服務器
  3. 資源所有者(resource owner):用戶你
  4. 客戶端(client):第三方白俊遙博客

資源服務器(resource server)和授權服務器(authorization server)我們統稱為 server ;
server 提供 OAuth 的認證服務;
client 則是使用 OAauth 服務;
在 PHP 社區中有一個以開發高質量擴展包著稱的組織 league ;
他們提供了兩個擴展包 oauth2-serveroauth2-client ;
分別實現了 server 和 client 服務;
Laravel 官方在 oauth2-client 的基礎上開發了 socialite 用于實現 OAuth 第三方登錄功能;
在 oauth2-server 基礎上開發了 Passport 用于實現 OAuth 的認證服務;

Passport 提供了以下功能:

  1. 管理 clients
  2. OAuth 的四種授權類型
  3. 個人訪問令牌 (personal access tokens)
  4. 管理令牌作用域 (scope)

鋪墊完畢下面正式進入 Passport 環節;
Passport 默認沒有安裝;
使用前需要先 require 引入包;

composer require laravel/passport

運行遷移生成表:

php artisan migrate

遷移命令會生成如下表:

表名作用
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 個命令;

  1. 生成用于加密的 key
php artisan passport:keys

執行后會在 storage 目錄下生成 key 文件;

  1. 創建 Client 的命令
php artisan passport:client
  1. 生成 key 并創建一個密碼類型的 client 和個人令牌

這個命令是組合調用了上面的命令1 + 命令2

php artisan passport:install

我們這里執行安裝命令:

php artisan passport:install

接著需要把 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;
    // ...
}

AuthServiceProviderboot 方法中調用 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();
    }
    // ...
}

這一步主要是注冊路由的;
我們可以通過 route:list 命令查看注冊的路由;

如果我們有需要修改這些方法的時候;
我們可以在 routes/api.php 覆蓋這些路由即可;
最后一步配置把 config/auth.php 中 guards 的 api 的 driver 選項改為 passport ;

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

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

Passport 還提供了 vue 前端組件;

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

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
);
// ...

這里寫一個管理 Client 的頁面;
routes/web.php

// ...
Route::view('clients', 'clients');

resources/views/clients.blade.php

@extends('layouts.app')

@section('content')
    <passport-clients></passport-clients>
@endsection

訪問 /clients 路由創建測試 Client ;

創建 Client 需要在登錄狀態下;
這里可以使用 Laravel 的用戶認證模塊;

php artisan make:auth

更多的可以參考之前寫的文章 最適合入門的Laravel中級教程(二)用戶認證 ;

接下來就是 OAuth 的 4 種類型了;
Passport 的流程都是標準的 OAuth ;
只是有些請求參數會稍微不同;
參考 Laravel 的文檔并配合 OAuth 系列 服用應該都可以輕松理解了;
這里就不贅述了;
Passport 的 token 使用的是 JWT 格式;
這個我也提前寫文章講解了 JWT(JSON Web Token) ;
簡單提一點的是這個 JWT 中是有一個用戶 id 的 ;
如果你的系統中需要加密用戶 id 的話;
可以參考我之前的文章 ;
Laravel Passport加密 JWT 格式的access_token中的sub(user_id)字段

除了標準的 OAuth 的 4 種類型;
Passport 還提供了個人訪問令牌功能;
如果對 個人訪問令牌不了解的話;
我們再次拿出之前舉的例子:
OAtuh 的四個角色;

  1. 資源服務器(resource server):github 服務器
  2. 授權服務器(authorization server):github 服務器
  3. 資源所有者(resource owner):用戶你
  4. 客戶端(client):第三方白俊遙博客

在講 OAuth 的時候一直都是 github 和白俊遙博客在操作;
那作為資源所有者的你如果也想使用 token 訪問你自己的資源;
這時候就可以使個人訪問令牌功能了;
個人訪問令牌是沒有過期時間的;
自然也就沒有刷新 token 的功能;
Passport 同樣提供了前端組件;
跟之前的管理 Clients 一樣;
這里就業不再啰嗦了;

    • zwsnail
白俊遙博客
請先登錄后發表評論
  • latest comments
  • 總共18條評論
白俊遙博客

小白的程序猿:1

2020-03-21 11:36:08 回復

白俊遙博客

liseen315:你說你是誰

2019-12-03 12:17:47 回復

白俊遙博客

guoshq:頁面調用passport的vue前端組件失效的話,記得---->注冊完組件后,確保運行?npm run dev?來重新編譯前端資源。白俊遙博客

2019-10-24 18:58:58 回復

白俊遙博客

████████████白俊遙博客

2019-10-09 17:21:35 回復

白俊遙博客

████████████:?白俊遙博客

2019-10-09 16:23:49 回復

白俊遙博客

████████████:">

2019-10-09 16:16:44 回復

白俊遙博客

阿小小甘:嘎哈哈哈哈哈哈哈哈

2019-10-09 10:12:25 回復

白俊遙博客

panxu71:博主 ,你的博客github快捷登錄 請求的接口會返回一個圖像路徑,你是怎么下載并保存到數據庫的 ,可以分享下代碼嗎?

2019-09-11 17:04:37 回復

白俊遙博客

最后守城人:666

2019-07-25 16:01:38 回復

白俊遙博客

余生未晚:學習學習

2019-07-15 15:31:09 回復

白俊遙博客

wcxxxxxx:測試下const name = "";el.innerHTML = name; // shows the alert

2019-07-11 14:47:38 回復

白俊遙博客

beuu:登錄 后 發表cgfbhncfh

2019-07-04 00:44:33 回復

白俊遙博客

River32:q去去去

2019-06-20 18:07:41 回復

白俊遙博客

崔榮志:我就試試白俊遙博客

2019-06-16 14:01:11 回復

白俊遙博客

* Armani:大佬,能出一期laravel任務調度的博客嗎

2019-06-11 15:32:24 回復

白俊遙博客

琳瑯天上:只想測試下評論是否支持 `markdown`

2019-06-03 22:55:02 回復

白俊遙博客

ShunYea:老大好,請教一個問題,我安裝了某個laravel項目,在執行composer install時候報錯,不知道如何解決,想請教一下是什么錯誤,謝謝。Loading composer repositories with package informationInstalling dependencies (including require-dev) from lock fileNothing to install or updatePackage phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.Generating autoload files> Illuminate\Foundation\ComposerScripts::postInstall> php -r "file_exists('.env') || copy('.env.example', '.env');"> php artisan optimizeFatal error: Uncaught Error: Call to undefined method Illuminate\Foundation\Application::configureMonologUsing() in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php:44Stack trace:#0 /www/wwwroot/www.xxyyzz.com/artisan(18): require_once()#1 {main}? thrown in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php on line 44PHP Fatal error:? Uncaught Error: Call to undefined method Illuminate\Foundation\Application::configureMonologUsing() in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php:44Stack trace:#0 /www/wwwroot/www.xxyyzz.com/artisan(18): require_once()#1 {main}? thrown in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php on line 44Script php artisan optimize handling the post-install-cmd event returned with error code 255

2019-06-03 17:26:06 回復

白俊遙博客 白俊遙博客
  • 云淡風晴 回復 ShunYea:phpunit-mock-objects 已經被棄用了; 這是個用于測試的包; 移除掉不會影響項目的正常運行; 執行?composer remove?phpunit/phpunit-mock-objects? 再試試
  • 2019-06-03 21:48:58 回復
白俊遙博客
  • ShunYea 回復 云淡風晴:您好,我執行這個命令報的錯誤跟上面一毛一樣……不知道是不是依賴還是什么環境沒有裝到位。折騰好久了。這個代碼別人寫的時候有的地方不嚴謹,故意設的套,讓你付費購買。自己研究已經解決了好幾個地方問題,但是安裝一直不順利。
  • 2019-06-05 00:08:02 回復
白俊遙博客
  • ShunYea 回復 云淡風晴:參照了你的這篇文章(http://www.vnchongxi.cn/article/148),不知道這個報錯是不是缺少什么組件。
  • 2019-06-05 00:10:53 回復
白俊遙博客
  • ShunYea 回復 ShunYea:仔細看了下,報錯的會不會是這個地方:Fatal error: Uncaught Error: Call to undefined method Illuminate\Foundation\Application::configureMonologUsing(),這個錯誤搜了半天國外有一個人問,但是沒有解決方案。不知道老大能否指點一二。謝謝。
  • 2019-06-05 00:13:43 回復
白俊遙博客 白俊遙博客
  • 云淡風晴 回復 ShunYea:參考這兩個試試;?https://github.com/barryvdh/laravel-debugbar/issues/789? ?https://github.com/markhilton/monolog-mysql/issues/2
  • 2019-06-08 10:33:28 回復
白俊遙博客

J????L???:問問而非

2019-06-02 16:37:05 回復

欢乐时时彩官网-首页