[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 在專案下安裝 Passportcomposer 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
留言
張貼留言