Auth với JWT Laravel + Reactjs

https://viblo.asia/p/auth-voi-jwt-laravel-reactjs-aWj53NaQl6m

Auth với JWT Laravel + Reactjs

jwtLaravelReactJS

Introduction

Hello ae, Hôm nay mình sẽ cùng build một mô hình Auth, register/login/logout bằng Laravel + Reactjs sử dụng JSON Web Token hay còn gọi là JWT

JWT là một token mà mình trong bài này sẽ generate ra để xác thực một user đã login hay chưa. Và thường được sử dụng cho những trang web có sử dụng Single Sign On,.. Luồng xử lý sẽ như thế này!

  1. Client gửi request đến sever kèm theo username + password

  2. Sever sẽ Auth và generate JWT và trả về cho client

  3. Client lưu lại JWT và gửi các request sau đó kèm theo JWT với Authorization header hoặc truyền trực tiếp trên thanh address bar

  4. Sever check JWT và trả response về cho client

Về cấu trúc của JWT JWT gồm các thành phần như ở dưới đây: Cấu trúc của nó gồm 3 phần chính Header, Payload và Signature và ở trong này này mình sẽ quan tâm nhất đến phần Payload sẽ được thể hiện ở phần code phía sever và bài này mình chọn laravel. Ae có thể sử dụng cái này để generate một cái JWT mà mình muốn https://jwt.io/

Các phiên bản mình sử dụng trong bài của mình:

  1. Laravel 5.7, PHP 7.3

  2. jwt-auth package https://github.com/tymondesigns/jwt-auth dev version

  3. ReactJs 16.2.0

  4. Mysql

Let's make an example

1. Building BackEnd (Cài đặt laravel, database, jwt-auth)

  1. Laravel 5.7, nếu sử dụng package jwt-auth ở trên ae không nên cài bản laravel mới nhất vì thời điểm mình làm demo này thì package này chưa hỗ trợ tốt bản laravel mới nhất, có thể gây ra lỗi rất khó chịu:

Di chuyển terminal vào thư mục của app

Chọn view ReactJs cho Laravel

Setup databse

Migrate bảng users

Chú ý: khi dùng package jwt-auth ta cần tạo thêm một row trong bảng users để lưu JWT token.

Trong file ta thêm:

Seed dữ liệu

Trong file database/factories/UserFactory.php

Đăng ký trong file seed: database/seeds/DatabaseSeeder.php

Migrate lại bằng php artisan migrate Seed database : php artisan db:seed

Cài đặt package jwt-auth

Config jwt trong thư mục /config/app.php

Generate JWT key cho app

Thêm function của package vào User model

Tạo một middleware để Auth user.

Trong file /app/Http/Middleware/JWTAuthMiddleware.php ta viết đoạn sau đây:

Như thường lệ, để một middleware có thể chạy ta cần đăng ký nó vào trong /app/Http/Kernel.php

Ta sẽ tạo một UserControllerđể handle các request register và login

với nội dung dưới đây:

Ta thấy ở trong methodgetToken() có gọi đến JWTAuth::attempt( ['email'=>$email, 'password'=>$password]) Ở đây mình sử dụng package jwt-auth và khi gọi đến hàm này ta có truyền 2 params là 'email'=>$emailpassword'=>$password] , theo đúng như tên gọi của nó JSON Web token, mình luôn phải truyền params theo kiểu json, cụ thể là mình đang truyền ['email'=>$email, 'password'=>$password] vào phần Payload trong JWT. Nhắc lại cấu trúc của JWT 1 chút ở đây: Cũng vì mình sử dụng package nên mình không cần quan tâm đến phần header hay Signature nữa, chỉ cần truyền payload vào => done!

Mỗi một lần login khác nhau chúng ta sẽ có một JWT khác nhau. Nhăc lại về luồng chạy:

Browser Login (OK) => Sever generate token => lưu token vào database => trả về cho client. Client gửi request kèm theo header với jwttoken =>Sever check và gửi về responses

Tiếp theo ta sẽ update routes trong file /routes/api.php

Vậy là đã tạm xong phần backend. Bây giờ chúng ta sẽ chuyển tiếp sang phần Frontend nhé.

2.Let's create some views (ReactJS)

Step #1: Update file welcome trong file /resources/views/welcome.blade.php với nội dung sau đây

Ở đây ta có window.Laravel từ javascript tiếp nhận các giá trị được truyền từ laravel vào và ta sẽ tiến hành append tất cả nội dung vào thẻ div có id là app

Tiếp theo ta sẽ sử dụng và import React Router v4 bằng command sau:

Và ta sẽ sử dụng history để quản lý lịch sử của browser

Step #2: Chúng tiếp tục tiến hành tạo các components của ReactJs như dưới đây

Trong thư mục /resources/js/components tạo các components sau đây và mình sẽ fill nội dung sau.

Tiếp tục tạo 1 file /resources/js/Http.js để thêm 1 vài options khi sử dụng axios để gửi request lên sever. Bắt đầu đi vào phần nội dung của các components:

Step #3: Fill nội dung component app. Đầu tiên với file Http.js

Giống như một instance của axios. Chúng ta sẽ tạo thêm option cho Http khi chúng ta access vào các route chạy qua middleware Auth Jwt bằng cách thêm Authentication vào header trông như thế này. Http.defaults.headers.common['Authorization'] = 'Bearer ' + auth_token;

File /resources/js/components/app.js

File app này chúng ta đã tiến hành import các components, định nghĩa route cho để điều hướng ứng dụng.

Step #4: Trở về định nghĩa route cho laravel: Trong file routes/web.php chúng ta sẽ thêm dòng dưới đây để bắt tất cả các request về file welcome.blade.php => bắt tất cả các request sang sử dụng react router.

Thêm một route/api/user trả về thông tin user để chốc nữa sẽ sử dụng ở trang profile => hơi lười viết nên viết luôn thế này cho nhanh.

Như ở đây ae có thể thấy /api/user sẽ chạy qua middleware của jwt-auth mà chúng ta định nghĩa. Và khi cần chạy vào route này chúng ta sẽ cần thêm option Authentication vào header của request.

Step #5: Fill nội dung cho các components còn lại

  1. Component App.js để tạo background cho trang:

Ở đây ta đã có một Component cha để bắt tất cả mấy thằng con vào{this.props.children}

  1. Component Page.js

Ở method getProfile() chúng ta có một dòng

Trước khi chúng ta send request sử dụng để pass qua middleware auth user mà chúng ta đã định nghĩa ở phía backend.

  1. Fill nội dung vào component Register.js

Màn Register của chúng ta sẽ như thế này.

Fill nội dung component Login.js

Màn login của chúng ta sẽ như thế này

Đăng nhập bằng tài khoản

Màn hình khi login thành công :

Chúc ae thành công

Last updated

Was this helpful?