Hướng dẫn đăng nhập sử dụng JWT + Laravel 8 mới nhất
19th Aug 2021Sử dụng Authentication Json Web Token (JWT).
Tại sao lại cần phải bảo mật API? Thật đơn giản, nó cũng giống như việc bạn đi vào một khách sạn vậy, muốn vào một căn phòng nào đó của khách sạn thì trước hết bạn phải qua lễ tân. Tại đây lễ tân sẽ tiến hành kiểm tra chứng mình thư, thẻ căn cước,... để xác thực được danh tính của bạn. Thì API cũng như vậy, trước ghi đáp ứng request mà bạn gửi lên, server cũng cần phải kiểm tra "chứng minh thư" của bạn để xác thực rõ xem bạn là ai, bạn đến từ đâu
1. Create project
composer create-project --prefer-dist laravel/laravel proyecto-jwt
2. Migrate
php artisan migrate
3. Intall JWT
composer require tymon/jwt-auth:dev-develop --prefer-source
3. Add JWT
Add line in Provider config/app.php
'providers' => [ /* ... */ Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ], 'aliases' => [ /* ... */ 'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class, 'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class, ],
4. Run JWT
php artisan jwt:secret
// res
// jwt-auth secret [XjaoZd3NYH3n3rkksEnu6geNJyDG6NFM5PKQJyvjGClGZQNAi6FrxrT6hmEbw3JF] set successfully.
5. Create Middleware
Create a middleware for JWT
php artisan make:middleware JwtMiddleware
app/Http/Middleware/JwtMiddleware.php
<?php namespace App\Http\Middleware; use Closure; use JWTAuth; use Exception; use Tymon\JWTAuth\Http\Middleware\BaseMiddleware; class JwtMiddleware extends BaseMiddleware { public function handle($request, Closure $next) { try { $user = JWTAuth::parseToken()->authenticate(); } catch (Exception $e) { if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException){ return response()->json(['status' => 'Token is Invalid']); }else if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException){ return response()->json(['status' => 'Token is Expired']); }else{ return response()->json(['status' => 'Authorization Token not found']); } } return $next($request); } }
6. Add route middleware
app/Http/Kernel.php
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /* ... */ /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ /* ... */ 'jwt.verify' => \App\Http\Middleware\JwtMiddleware::class, ]; }
7. Model User
app/Models/User.php
<?php namespace App\Models; // ... // use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Authenticatable implements JWTSubject { // ... // public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } }
8. Create controller
php artisan make:controller UserController
Nội dung
<?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use JWTAuth; use Tymon\JWTAuth\Exceptions\JWTException; use Log; class UserController extends Controller { public function authenticate(Request $request) { $credentials = $request->only('email', 'password'); try { if (! $token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'invalid_credentials'], 400); } } catch (JWTException $e) { return response()->json(['error' => 'could_not_create_token'], 500); } return response()->json(compact('token')); } public function getAuthenticatedUser() { try { if (!$user = JWTAuth::parseToken()->authenticate()) { return response()->json(['user_not_found'], 404); } } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { return response()->json(['token_expired'], $e->getStatusCode()); } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { return response()->json(['token_invalid'], $e->getStatusCode()); } catch (Tymon\JWTAuth\Exceptions\JWTException $e) { return response()->json(['token_absent'], $e->getStatusCode()); } return response()->json(compact('user')); } public function register(Request $request) { Log::info($request); $validator = Validator::make($request->all(), [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users', 'password' => 'required|string|min:6|confirmed', ]); if($validator->fails()){ return response()->json($validator->errors()->toJson(),400); } $user = User::create([ 'name' => $request->get('name'), 'email' => $request->get('email'), 'password' => Hash::make($request->get('password')), ]); $token = JWTAuth::fromUser($user); return response()->json(compact('user','token'),201); } }
9. Create Router
Route::post('register', 'App\Http\Controllers\UserController@register'); Route::post('login', 'App\Http\Controllers\UserController@authenticate'); Route::group(['middleware' => ['jwt.verify']], function() { Route::post('user','App\Http\Controllers\UserController@getAuthenticatedUser'); });
10. Run project
php artisan serve
Test Postman
Register
http://localhost:8000/api/register
{ "name" : "artyom developer", "password" : "tutofox123", "password_confirmation" : "tutofox123", "email" : "[email protected]" }
Login
http://localhost:8000/api/login { "email" : "[email protected]", "password" : "tutofox123" }
User
http://localhost:8000/api/user
Attachment | Size |
---|---|
jwt-auth-master.zip91.8 KB | 91.8 KB |
Add new comment