Auth với JWT Laravel + Reactjs
https://viblo.asia/p/auth-voi-jwt-laravel-reactjs-aWj53NaQl6m
Auth với JWT Laravel + Reactjs
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!
Client gửi request đến sever kèm theo username + password
Sever sẽ Auth và generate JWT và trả về cho client
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
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:
Laravel 5.7, PHP 7.3
jwt-auth package https://github.com/tymondesigns/jwt-auth dev version
ReactJs 16.2.0
Mysql

Let's make an example
1. Building BackEnd (Cài đặt laravel, database, jwt-auth)
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'=>$email và password'=>$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
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}
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.
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?