(jwt+dingo)和(passport+dingo)使用

Laravel實現dingo+JWT api接口之配置篇
Laravel實現dingo+JWT api接口之實戰篇

  1. 安裝dingo

  2. 你需要修改你的 composer.json 文件,然后執行 composer update 把最后一個版本的包加入你的項目
"require": {
    "dingo/api": "1.0.*@dev"
}

或者直接

composer require dingo/api:1.0.x@dev
  • 打開 config/app.php,注冊必要的 service provider 在你的應用 providers 之前。
'providers' => [
    Dingo\Api\Provider\LaravelServiceProvider::class
]
  • 生成dingo配置文件 config/api.php :
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
  • .env添加基礎配置(四個即可):
#標準樹
API_STANDARDS_TREE=vnd
#前綴
API_PREFIX=api
#版本
API_VERSION=v1
#開啟調試
API_DEBUG=true
phpAPI_STANDARDS_TREE=vnd
API_SUBTYPE=biubiujun
API_PREFIX=api
API_VERSION=v1
API_NAME=BiuBiuJun
API_CONDITIONAL_REQUEST=false
API_STRICT=false
API_DEFAULT_FORMAT=json
API_DEBUG=true
API_STANDARDS_TREE - API規格 
  1 本地或私有環境 
  2 prs 非商業銷售的項目 
  3 vnd 公開的以及商業銷售的項目
API_SUBTYPE - API簡稱 
API_PREFIX - API前綴(或使用API_DOMAIN - API子域名) 
API_VERSION - API默認版本 
API_NAME - API名稱 
API_CONDITIONAL_REQUEST - 帶條件的請求,由于緩存API請求的時候會使用客戶端緩存功能,所以默認開啟了帶條件的請求 
API_STRICT - 嚴格模式,要求客戶端發送Accept頭而不是默認在配置文件中指定的版本 
API_DEFAULT_FORMAT - 響應格式,默認的響應格式是JSON 
API_DEBUG - 調試模式
  1. 你需要修改你的 composer.json 文件,然后執行 composer update 把最后一個版本的包加入你的項目
"require": {
    "tymon/jwt-auth": "0.5.*"
}

或者直接

composer require tymon/jwt-auth
  • 打開 config/app.php,注冊到 providers 數組。
'providers'=>[
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
]
  • 注冊jwt門面:
'aliases'=>[
'JWTAuth'=> Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory'=> Tymon\JWTAuth\Facades\JWTFactory::class,
]
  • 生成jwt配置文件 config/jwt.php :
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
  • 生成 jwt.php 文件中數組的 secret 鍵成對應的值:
php artisan jwt:generate
  • 關聯dingo與JWT

修改 config/api.phpauth 如下:

'auth' => [  
    'basic' => function($app){  
        return new Dingo\Api\Auth\Provider\Basic($app['auth']);  
    },  
    'jwt' => function($app){  
        return new Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']);  
    }  
],  
  • 安裝passport

    1. 使用 Composer 依賴包管理器安裝 Passport :
composer require laravel/passport
  • 接下來,將 Passport 的服務提供者注冊到配置文件 config/app.phpproviders 數組中:
    Laravel\Passport\PassportServiceProvider::class,
    Passport 使用服務提供者注冊內部的數據庫遷移腳本目錄,所以上一步完成后,你需要更新你的數據庫結構。Passport 的遷移腳本會自動創建應用程序需要的客戶端數據表和令牌數據表:
  • php artisan migrate
    添加了如下幾張表:
Migrating: 2016_06_01_000001_create_oauth_auth_codes_table
Migrating: 2016_06_01_000002_create_oauth_access_tokens_table
Migrating: 2016_06_01_000003_create_oauth_refresh_tokens_table
Migrating: 2016_06_01_000004_create_oauth_clients_table
Migrating: 2016_06_01_000005_create_oauth_personal_access_clients_table

如果你不打算使用 Passport 的默認遷移,你應該在 AppServiceProviderregister 方法中調用 Passport :: ignoreMigrations 方法。 你可以導出這個默認遷移用 php artisan vendor:publish --tag=passport-migrations 命令。

  1. 接下來,你需要運行 passport:install 命令來創建生成安全訪問令牌時用到的加密密鑰,同時,這條命令也會創建「私人訪問」客戶端「密碼授權」客戶端:【運行 passport:install 命令,該命令將會創建生成安全訪問令牌(token)所需的加密鍵,此外,該命令還會創建 personal accesspassword grant 客戶端用于生成訪問令牌,該命令會在 storage 目錄中生成認證需要的加密鍵, oauth-private.keyoauth-public.key
    php artisan passport:install
    執行上述代碼后的結果:
Encryption keys generated successfully.
Personal access client created successfully.
Client ID: 1
Client Secret: e7pPOyPMFiEuE5EvtDvY9qsesfTgqNhb61r37cez
Password grant client created successfully.
Client ID: 2
Client Secret: eI4XKieiDQRUCMpnfb3g5MOr8SItQ5rCZBv3bWO3
  • 上面命令執行后,請將 Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中,這個 Trait 會給你的模型提供一些輔助函數,用于檢查已認證用戶的令牌和使用作用域:
<?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;
}
  • 接下來,需要在 AuthServiceProviderboot 方法中調用 Passport::routes 函數。這個函數會注冊一些在訪問令牌、客戶端、私人訪問令牌的發放和吊銷過程中會用到的必要路由:
<?php
namespace App\Providers;
use Carbon\Carbon;
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();

        Passport::tokensExpireIn(Carbon::now()->addDays(15));

        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));

        Passport::pruneRevokedTokens();
    }
}

最后,需要將配置文件 config/auth.phpapi 部分的授權保護項( driver )改為 passport 。此調整會讓你的應用程序在接收到 API 的授權請求時使用 Passport 的 TokenGuard 來處理:

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

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',//【可能這里需要修改】
    ],
],
  • 如果用手機號進行授權的話,需要修改模型
    /**
     * [findForPassport passport通過手機號/賬號驗證]
     * @param  [type] $username [description]
     * @return [type]           [description]
     */
    public function findForPassport($username)
    {
        // if (!$this->where('phone', $username)->first()) {
        //     return $this->where('name', $username)->first();
        // }
        // return true;

        return $this->where('phone', $username)->first();

        // return $this->where('phone', $username)->first() || $this->where('name', $username)->first();
    }
php artisan passport:client --password

配置Dingo使用Passport密碼發放令牌

  • 創建 PassportDingoProvider
php artisan make:provider PassportDingoProvider
  • 修改 app/Providers/PassportDingoProvider.php
<?php
namespace App\Providers;
use Dingo\Api\Routing\Route;
use Illuminate\Http\Request;
use Dingo\Api\Auth\Provider\Authorization;
class PassportDingoProvider extends Authorization
{
    public function authenticate(Request $request, Route $route)
    {
        return $request->user();
    }
    public function getAuthorizationMethod()
    {
        return 'bearer';
    }
}
  • 修改 config/api.php
'auth' => [ 
    'custom' => \App\Providers\PassportDingoProvider::class
],
  • 修改 App/Http/Kernel.php
protected $middlewareGroups = [
   ...
   'api:auth' => [
       'auth:api',
       'api.auth'
    ]
    ...
];
  • routes/api.php 修改之前注冊路由
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', ['middleware' => 'api:auth', 'namespace' => 'App\Http\Controllers\Api\V1'], function ($api) {
    $api->get('user/{id}', 'UserController@show');
    $api->get('user', 'UserController@index');
});
  • 測試-請求令牌
    curl -d "username=biubiujun@163.com@password=123456@grant_type=password&client_id=<client_id>&client_secret=<client_secret>" http://localhost/path/public/api/oauth/token
  • 測試-請求用戶列表
curl -H "Authorization: Bearer <token>" http://localhost/path/public/api/user
composer require zircote/swagger-php
  • 創建 SwaggerController
php artisan make:controller SwaggerController
  • 修改 app/Http/Controller/SwaggerController
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
class SwaggerController extends Controller
{
    public function doc()
    {
        $swagger = \Swagger\scan(__DIR__ . '/../');
        return response()->json($swagger);
    }
}
  • 下載 swagger-ui
    swagger-ui
    • 將swagger-ui/dist目錄放入public/doc
    • 修改public/doc/index.html
<script src='lang/translator.js' type='text/javascript'></script>
<script src='lang/zh-cn.js' type='text/javascript'></script>
<script type="text/javascript">
    $(function () {
      var url = window.location.search.match(/url=([^&]+)/);
        if (url && url.length > 1) {
          url = decodeURIComponent(url[1]);
        } else {
          // url = "http://petstore.swagger.io/v2/swagger.json"
          url = "/api/doc";
        }

訪問http://localhost/path/public/doc/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 前言 也可以關注我的個人博客 ?這里摘錄下laravel5.5教程的認證文檔,做個總結,方便今后查閱。 安裝pas...
    小峰書閱讀 2,113評論 0 1
  • 是什么 如果你知道yum、apt-get、npm、bower等命令中的一種或者多種,那么,你也能很快知道compo...
    旱魃一樣閱讀 3,166評論 0 9
  • Composer Repositories Composer源 Firegento - Magento模塊Comp...
    零一間閱讀 3,970評論 1 66
  • 我是易效能G130的學員袁斌,現在是G153: 2班5組的復訓生。 我的三個標簽: 1、我是一個25歲小孩的媽媽 ...
    自由飛翔呀閱讀 448評論 0 0