Hướng dẫn đăng nhập sử dụng JWT + Laravel 8 mới nhất

Written by Tommy
Posted on Thu, 08/19/2021 - 12:20
1196 views

Share Everywhere

Table of contents

Sử 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\[email protected]');

Route::post('login', 'App\Http\Controllers\[email protected]');​

Route::group(['middleware' => ['jwt.verify']], function() {​

    Route::post('user','App\Http\Controllers\[email protected]');​

});

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

Attach
Attachment Size
jwt-auth-master.zip 91.8 KB