Trong bài trước chúng ta đã cùng tìm hiểu về jwt, nó là gì và cách sử dụng như thế nào. Trong bài viết này mình sẽ chia sẻ tới các bạn một ứng dụng thực tế của JWT qua một ứng dụng xây dựng API xác thực người dùng đăng nhập dựa trên framwork Laravel.
1. Yêu cầu
– Yêu cầu về cấu hình hệ thống
PHP 7.4
Laravel 8.x
Ứng dụng Postman để chạy các api
– Các chức năng sẽ làm: login, profile
+ Login: Khi người dùng login, sẽ nhận được token từ serve
+ Profile: Mỗi khi gọi api profile, người dùng sẽ đính kèm trong header một đoạn mã được lấy từ api login, nếu xác thực đúng token thì api sẽ trả về thông tin profile người dùng, ngược lại trả lại lỗi xác thực.
2. Cài đặt gói firebase/php-jwt
Đầu tiên chúng ta sẽ cài đặt gói firebase/php-jwt để giải mã và xác thực JWTcomposer require firebase/php-jwt
3. Viết code lớp FirebaseToken
Tiếp theo chúng ta sẽ đi tạo folder services trong thư mục app của ứng dụng. Thư mục này sẽ chứa tất cả các service bên thứ 3 mà chúng ta sẽ dùng cho dự án. Tạo file FirebaseJwtToken.php trong app/services. Từ bây giờ tất cả các nghiệp vụ xử lý JWT như encode, decode hay validate chuỗi token… sẽ được viết trong file này. Chúng ta sẽ đi viết 2 hàm quan trọng nhất đó là hàm encode và decode với mục đích tạo chuỗi token để gửi lại phía client và decode chuỗi token được truyền lên mỗi lần cần validate.
4. Viết code router
Để bắt đầu xây dựng ứng dụng, chúng ta sẽ tạo ra 2 api trong thư mục routes/api.php.
Có một số yêu cầu cho ứng dụng API của chúng ta như sau:
– Tất cả các response đều ở dạng
– Không có redirect tới route khác
Các bạn lưu ý là route get thông tin người dùng (/profile) chúng ta sẽ cần phải xác thực qua middleware trước thì mới có thể hiển thị được thông tin người dùng. Middleware này sẽ được viết ở các phần tiếp
5. Viết code controller
– Hàm xử lý login
Đây là hàm login trong controller xử lý nhiệm vụ login. Hàm này sẽ nhận thông tin đầu vào của người dùng là email, password. Quá trình xác thực diễn ra nếu thông tin gửi lên là hợp lệ thì chúng ta sẽ gọi hàm gen access token từ service đã viết ở phần trước và gửi mã này về cho phía client.
Tuy nhiên mỗi khi gọi api get profile thì nó sẽ phải được xác thực bằng middleware. Chúng ta viết code middlware trong app/http/Middleware và tạo file JwtMiddleware.php
Các bạn đừng quên thêm middlware này vào trong file Kernel.php nhé. Như vậy là chúng ta đã cùng đi hết tất cả những đoạn code cần thiết để có thể chạy được ứng dụng. Tiếp theo mình sẽ chạy thực tế trên postman với 2 api mà chúng ta vừa viết.
6. Test ứng dụng với Postman
Giả định rằng trong database chúng ta đã tạo sẵn 1 user với thông tin đăng nhập như sau: user@gmail.com/123456
Bây giờ chúng ta sẽ đi test route login với thông tin user ở trên:
Như vậy là api login đã hoạt động. Quá trình xác thực thành công, client nhận được một mã token trong response trả về. Bây giờ chúng ta sẽ sử dụng mã này cho api get profile.
Các bạn chọn Authorization và chọn type là Bearer Token, sau đó điền thông tin token lấy được từ api login nhé. Kết quả hiển thị sẽ như vậy. Nếu chúng ta cố tình sửa sai token thì data trong response trả về sẽ null, và bị báo lỗi xác thực.
Kết luận
Như vậy đến đây coi như chúng ta đã xây dựng xong ứng dụng api xác thực đơn giản kết hợp laravel và jwt. Những việc chúng ta đã thực hiện được như sau:
– Cài đặt thư viện firebase/php-jwt
– Tạo middleware xác thực token
– Phát triển 2 chức năng là login và get thông tin profile
– Test 2 api và biết thêm kiến thức sử dụng Postman để test api
Qua 2 bài viết về JWT và kết hợp JWT với laravel, mình hy vọng các bạn đã có thể hiểu và có được cái nhìn cơ bản về cách thức xác thực này. Nó là một phần rất quan trọng được sử dụng ở hầu hết các công ty khi đi làm nên các bạn dành thêm thời gian để nghiên cứu nó nhiều hơn nhé.