每天一點點之laravel框架 - Laravel5.6 + Passport實現Api接口認證


 

1.首先通過 Composer 包管理器安裝 Passport:

composer require laravel/passport

注:如果安裝過程中提示需要更高版本的 Laravel:laravel/passport v5.0.0 requires illuminate/http ~5.6,可以通過指定版本來安裝 composer require laravel/passport ~4.0

 

2.注冊服務提供者

將 Passport 的服務提供者注冊到配置文件 config/app.php 的 providers 數組中

Laravel\Passport\PassportServiceProvider::class,

Laravel 5.5之后會自動注冊服務提供者

 

3.遷移數據庫

php artisan migrate

注:如果你不想使用 Passport 的默認遷移,需要在 AppServiceProvider 的 register 方法中調用 Passport::ignoreMigrations 方法。你可以使用 php artisan vendor:publish --tag=passport-migrations 導出默認遷移。

 

部署 Passport

第一次部署 Passport 到生產服務器時,可能需要運行 passport:keys 命令。這個命令生成 Passport 需要的加密 keys 以便生成訪問令牌,生成的 keys 將不會存放在源代碼控制中:

php artisan passport:keys

 

4.創建生成安全訪問令牌(token)所需的加密鍵

需要運行 passport:install 命令,該命令將會創建生成安全訪問令牌(token)所需的加密鍵,此外,該命令還會創建「personal access」和「password grant」客戶端用於生成訪問令牌:

php artisan passport:install
生成記錄存放在數據表 oauth_clients

 

5.運行完這個命令后,添加 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;
}

 

6.接下來,你需要在 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();
    }
}

 

7.最后,在配置文件 config/auth.php 中,需要設置 api 認證 guard 的 driver 選項為 passport。這將告知應用在認證輸入的 API 請求時使用 Passport 的 TokenGuard

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

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

 

 

密碼授權令牌

OAuth2 密碼授權允許你的其他第一方客戶端,例如移動應用,使用郵箱地址/用戶名+密碼獲取訪問令牌。這使得你可以安全地頒發訪問令牌給第一方客戶端而不必要求你的用戶走整個 OAuth2 授權碼重定向流程。

創建密碼發放客戶端

在應用可以通過密碼授權頒發令牌之前,需要創建一個密碼授權客戶端,你可以通過使用帶 --password 選項的 passport:client 命令來實現。如果你已經運行了 passport:install 命令,則不必再運行這個命令:

php artisan passport:client --password

這里我們使用一開始通過 passport:install 命令創建的記錄作為測試記錄。

請求令牌

創建完密碼授權客戶端后,可以通過發送 POST 請求到 /oauth/token 路由(帶上用戶郵箱地址和密碼)獲取訪問令牌。這個路由已經通過 Passport::routes 方法注冊過了,不需要手動定義。如果請求成功,就可以從服務器返回的 JSON 響應中獲取 access_token 和 refresh_token

和通過授權碼返回數據格式一致。

這里的username使用的是email,如果想要通過name、iphone來獲取,需要在users模型中添加一下方法

    // 允許passport通過這些字段找到你的用戶實例
    public function findForPassport($name)
    {
        $user = Users::where('name', $name)
            // ->orWhere('phone', $name)
            ->orWhere('email', $name)
            ->first();
        return $user;
    }

 

注:記住,訪問令牌默認長期有效,不過,如果需要的話你也可以配置訪問令牌的最長生命周期

 

 友情鏈接:

  laravel官網-API身份驗證

  [ Laravel 5.6 文檔 ] 安全系列 —— API 認證

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM