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

19th Aug 2021
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\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

Attach
Attachment Size
jwt-auth-master.zip91.8 KB 91.8 KB

Add new comment

Image CAPTCHA
Enter the characters shown in the image.

Related Articles

Mỗi kết nối cơ sở dữ liệu được định nghĩa trong một mảng, với tên kết nối là khóa của mảng

Eager Loading là một kỹ thuật tối ưu hóa truy vấn cơ sở dữ liệu trong Laravel, giúp tăng tốc độ truy vấn và giảm số lượng truy vấn cần thiết để lấy dữ liệu liên quan đến một bản ghi.

Để sử dụng Eager Loading với điều kiện trong Laravel, bạn có thể sử dụng phương thức whereHas hoặc orWhereHas trong Eloquent Builder.

E hiểu đơn giản vầy nha. auth() hay Auth trong laravel là những function global hay class, nó cũng chỉ là 1 thôi

Xin chào các bạn, tuần này mình sẽ viết một bài về cách xử lý Real Time(thời gian thực) với Laravel và Pusher