如何滿足 API 場景下的授權需求呢?

零下一度
發布: 2023-03-10 16:08:01
原創
1569 人瀏覽過

介紹

在 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 = [&#39;App\Model&#39; => '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', 'UserController@login');
});

Route::group(['middleware' => 'auth:api', 'namespace' => 'api'], function() {
    Route::get('details', 'UserController@details');
});
登入後複製
一個是用來登錄,取得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的程式碼。

 

以上是如何滿足 API 場景下的授權需求呢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板