Laraval Authentication (1)-> 自行token可以參考先前的「Eloquent ORM 實作(2):以登入為例」這篇。
Passport也在官方文件中,也是一種 OAuth委任授權技術機制。
使用好處如下:
.
.
.
作法如下
先到專案資料夾上安裝 composer require laravel/passport
因為passport透過composer安裝後會有許多新的table,先php artisan migrate
後會發現以下資料表建立成功。
再執行 php artisan passport:install
加入使用passport必要設定
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
//路由
Passport::routes();
//有效時間
Passport::personalAccessTokensExpireIn(now()->addMinutes(1));
}
因為主要是用在api溝通上,所以僅修改api的部分。
api' => [
// 'driver' => 'token',-> 原作法
'driver' => 'passport',
'provider' => 'users',
'hash' => false,
],
因為把passport機制修改到config/auth.php裡頭,所以要決定哪個api要使用passport時,router需設定如下,才能使用passport:
Auth::routes();
Route::middleware('auth:api')->group(function() {
Route::get('user/{userId}/detail', 'Auth\LoginController@show');
});
作法
跟原本的很類似,但在token部分改用passport的方法。
$credentials = $request->only('name', 'password');
if (Auth::guard()->attempt($credentials)) {
$user = Auth::user();
$token = $user->createToken($user->name . '-' . now());
return response()->json(['token' => $token->accessToken]);
} else {
return response()->json(['error01' => 'invalid name or password'], 401);
}
成果
方法
public function show(Request $request, $userId)
{
if (Auth::user()->id == $userId) {
return response()->json(['message' => Auth::user()], 200);
}else{
return response()->json(['message' => 'User id error'], 404);
}
}
成果
可以將 passport產生的token放在Auth,就可取得user資料
或把token放在header
沒有提供正確token會跳出
{ "message": "Unauthenticated." }
參考資料
https://laravel.com/docs/7.x/passport#introduction
https://learnku.com/docs/laravel/7.x/passport/9420
https://webomnizz.com/rest-api-and-passport-authentication-with-laravel/
https://stackoverflow.com/questions/59559949/in-which-cases-using-of-laravel-passport-gives-some-advantage