1. 程式人生 > >Laravel 5.4建站06--API 認證系統 Passport

Laravel 5.4建站06--API 認證系統 Passport

檢查 resp alt pre tails provide 函數 onf gis

介紹

在 Laravel 中,實現基於傳統表單的登陸和授權已經非常簡單,但是如何滿足 API 場景下的授權需求呢?在 API 場景裏通常通過令牌來實現用戶授權,而非維護請求之間的 Session 狀態。現在 Laravel 項目中可以使用 Passport 輕而易舉地實現 API 授權過程,通過 Passport 可以在幾分鐘之內為你的應用程序添加完整的 OAuth2 服務端實現。


安裝

使用 Composer 依賴包管理器安裝 Passport :

 composer require laravel/passport

接下來,將 Passport 的服務提供者註冊到配置文件 config/app.php 的 providers 數組中:

Laravel\Passport\PassportServiceProvider::class

Passport 使用服務提供者註冊內部的數據庫遷移腳本目錄,所以上一步完成後,你需要更新你的數據庫結構。Passport 的遷移腳本會自動創建應用程序需要的客戶端數據表和令牌數據表:

php artisan migrate

接下來,你需要運行 passport:install 命令來創建生成安全訪問令牌時用到的加密密鑰,同時,這條命令也會創建「私人訪問」客戶端和「密碼授權」客戶端:

php artisan passport:install

上面命令執行後,修改 App\User.php ,用於檢查已認證用戶的令牌和使用作用域:

<?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; // 增加 HasApiTokens

接下來,需要在 AuthServiceProvider 的 boot 方法中調用 Passport::routes 函數。這個函數會註冊一些在訪問令牌、客戶端、私人訪問令牌的發放和吊銷過程中會用到的必要路由:

修改 App\Providers\AuthServiceProvider.php :

<?php

namespace App\Providers;

use Laravel\Passport\Passport; // 新增
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Carbon\Carbon; // 新增引用

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路由

        //令牌的有效期
        Passport::tokensExpireIn(Carbon::now()->addDays(15));

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

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

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

    ‘api‘ => [
        ‘driver‘ => ‘passport‘, // 改為passport
        ‘provider‘ => ‘users‘,
    ],
],

測試

api的路由是api.php 。打開 routes\api.php ,添加測試路由。

Route::group([‘namespace‘ => ‘api‘], function () {
    Route::post(‘/login‘, [email protected]);
});

Route::group([‘middleware‘ => ‘auth:api‘, ‘namespace‘ => ‘api‘], function() {
    Route::get(‘details‘, [email protected]);
});

一個是用來登錄,獲取token,另一個是用獲取到的token完成登錄驗證,取到當前用戶資料。

details路由,用到了auth:api 中間件,用它來驗證token。

在 App\Http\ 目錄建立 api 文件夾,並添加UserController.php

<?php

namespace App\Http\Controllers\api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\User;
use Response;

class UserController extends Controller
{
    public function __construct()
    {
        $this->content = array();
    }
    public function login()
    {
        if(Auth::attempt([‘email‘ => request(‘email‘), ‘password‘ => request(‘password‘)]))
        {
            $user = Auth::user();
            $this->content[‘token‘] =  $user->createToken(‘Pizza App‘)->accessToken;
            $status = 200;
        } else {
            $this->content[‘error‘] = "未授權";
             $status = 401;
        }
         return response()->json($this->content, $status);    
    }
    public function details()
    {
        return response()->json([‘user‘ => Auth::user()]);
    }
}

在 postman 裏測試:

技術分享

如上圖所示,登錄方法要匹配路由,用post方式,以表單方式把用戶的email 和 password 傳遞到 api/login

技術分享

如果傳遞正確的話,會得到上圖的token

技術分享

把上個步驟得到的token 添加在Header裏,並在token前加上‘Bearer ‘。然後就可以得到當前用戶的資料了。也就是完成了用戶身份驗證。

以上不保證完全正確。歡迎查看我的GitHub的代碼。 

Laravel 5.4建站06--API 認證系統 Passport