[Laravel] API身分驗證 - Laravel Passport 安裝及用法

Image from: http://www.cloudways.com/blog/wp-content/uploads/Laravel-Login-Authentication-Banner.jpg


什麼是Laravel Passport

使用前,先簡單介紹Laravel passport,開發API時身分驗證是很重要的,而Laravel Passport提供原生OAuth 2 服務的組件,可通過Composer 將Laravel Passport安裝到自己的專案中,而且使用上非常簡單。

環境配置

Laravel版本:5.4

Passport安裝流程

1.使用 Composer 在專案下安裝 Passport
composer require laravel/passport

2. 將 Passport 的providers註冊到配置檔案 config/app.php 的 providers 陣列中:
Laravel\Passport\PassportServiceProvider::class
3.執行migrate安裝passport需要的資料表
php artisan migrate
4.執行 passport:install
php artisan passport:install
5. 修改 App\User.php ,引入 Laravel\Passport\HasApiTokens,用於檢查已認證使用者的token
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
}

6.修改 App\Providers\AuthServiceProvider.php,在文件中引入use Laravel\Passport\Passport;,並在boot()方法中加入OAuth2 route方法 Passport::routes()
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
{
  public function boot()
  {
  $this->registerPolicies();
  Passport::routes(); // 註冊passport路由
  //令牌的有效期
  Passport::tokensExpireIn(Carbon::now()->addDays(15));
  Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
  }
}

7.將配置檔案 config/auth.php 中 api 部分的授權保護項( driver )改為 passport 。此調整會讓你的應用程式在接收到 API 的授權請求時使用 Passport 的 TokenGuard 來處理:
'guards' => [
  'web' => [
  'driver' => 'session',
  'provider' => 'users',
  ],
  'api' => [
  'driver' => 'passport', // 改為passport
  'provider' => 'users',
  ],
]

修改驗證失敗的路徑

passport驗證失敗的路徑預設是Auth\Login,進入app\Exceptions\Handler.php,找到unauthenticated方法,將舊有guest指到要修改的路徑
 protected function unauthenticated($request, AuthenticationException $exception)
  {
  if ($request->expectsJson()) {
  return response()->json(['error' => 'Unauthenticated.'], 401);
  }
  // return redirect()->guest(route('login'));
  return redirect()->guest('api/AuthFail');//修改的
  }

測試

1.開啟routes\api.php,新增測試route
Route::group(['namespace' => 'api'], function () {
  Route::post('/login', 'UserController@login');
});
Route::group(['middleware' => 'auth:api', 'namespace' => 'api'], function() {
  Route::get('details', 'UserController@details');
});

2.一個是用來登入,獲取token,另一個是用獲取到的token完成登入驗證,取到當前使用者資料。
details路由,用到了auth:api 中介軟體,用它來驗證token

留言

這個網誌中的熱門文章

[PHP] 正規表達式 過濾特殊符號 / 過濾非字母數字的字元 / 過濾字母數字