Authenticate với Laravel Sanctum

LAMP Oct 22, 2021

Trong rất nhiều dự án mình từng làm trước đây đều sử dụng JWT token để authenticate user khi login, logout hay truy cập API. Bỗng một ngày sau khi "khá" thành thạo và "chán"  giải pháp xác thực này, mình muốn thử cái gì mới xem sao, vô tình sau khi lướt lướt 1001 các diễn đàn thì tìm được một vài package hay ho cũng rất được recommend trong cộng đồng PHP , là Laravel Passport với Laravel Sanctum. Mình đã thử qua cả hai package này rồi, thấy rất là tiện nhưng trong bài viết này mình xin phép chia sẻ trước về Laravel Sanctum nhé . HIHI !! 😀

Từ version 7.x, Laravel đã giới thiệu Sanctum là một official package. Nó cung cấp một hệ thống xác thực đơn giản để phát triển SPA, mobile apps và token-based authentication dành cho API. Sanctum cho phép user tạo nhiều API tokens cho tài khoản của họ. Các tokens này có khả năng chỉ định các actions mà user đó có thể thực hiện được khi sử dụng.

1️⃣ Vấn đề Sanctum hướng tới

  1. API Tokens
  • Sinh ra API tokens cho admin mà không cần tới Oauth. Nếu web app có màn hình cho phép admin tạo API token cho tài khoản của họ. Bạn có thể sử dụng Sanctum để tạo và quản lý các tokens này. Những tokens này có thể settting thời gian hết hạn dài nhưng cũng có thể hủy bỏ chúng bất cứ lúc nào.
  • Laravel Sanctum cung cấp tính năng này bằng cách lưu trữ token trong một bảng cơ sở dữ liệu duy nhất và xác thực các requests thông qua API token hợp lệ được gắn trên Authorization header.

2. SPA Authentication

  • Sanctum không sử dụng bất kỳ loại token nào. Thay vào đó, Sanctum sử dụng các dịch vụ xác thực phiên dựa trên cookie được tích hợp sẵn của Laravel. Điều này cung cấp các lợi ích của CSRF protection, session authentication, cũng như bảo vệ chống rò rỉ thông tin xác thực qua XSS. Sanctum sẽ chỉ cố gắng xác thực bằng cookie khi request bắt nguồn từ giao diện người dùng SPA của bạn.

2️⃣ Sử dụng trong dự án như thế nào ?

Sau khi cài đặt một dự án Laravel bình thường, mình sẽ cài Laravel Sanctum qua Composer package manager như sau :

composer require laravel/sanctum

Hoặc require ở file composer.json.

Như mình đã nói ở trên, để sử dụng các chức năng của Sanctum, ta phải publish file config và migration của Sanctum để có bảng lưu token

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

Ngoài ra, nếu sử dụng Sanctum để xác thực một SPA, mình thêm Middleware của Sanctum vào Middleware api trong app / Http / Kernel.php:

Sanctum tạo API tokens bằng method createToken. Chúng sẽ được hash bằng hàm SHA-256 trước khi lưu vào database và chúng ta có thể lấy ra sử dụng thông qua property plainTextToken

Sanctum cũng cung cấp một số method để có thể thu hồi lại token trong những trường hợp cần thiết

// Revoke all tokens...
$user->tokens()->delete();

// Revoke a specific token...
$user->tokens()->where('id', $tokenId)->delete();

Để authenticate SPA , trang login của SPA trước tiên phải thực hiện yêu cầu tới                   / sanctum / csrf-cookie để khởi tạo bảo vệ CSRF cho ứng dụng:

axios.get('/sanctum/csrf-cookie').then(response => { // Login... });

Còn để bảo vệ các route sao cho tất cả các request từ client đến server phải được xác thực, mình nên gắn trình xác thực sanctum vào các route API. Hành động này sẽ đảm bảo rằng các requesst sẽ được xác thực dưới dạng yêu cầu được xác thực trạng thái từ SPA của bạn hoặc chứa tiêu đề mã thông báo API hợp lệ nếu yêu cầu đến từ bên thứ ba:

use Illuminate\Http\Request;


Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
   return $request->user();
});

Còn với action login sau khi nhập email, password sẽ sinh ra 1 token và lưu vào bảng personal_access_tokens.

Khi có token này , mình sẽ dùng để xác thực cho các action khác như lấy, thêm sửa xóa dữ liệu.

Ngoài ra Sanctum còn hỗ trợ cho việc testing, unit test qua method Sanctum::actingAs

  Trong bài này, mình đã sử dụng Laravel Sanctum để build một Restful API. Về chức năng,  nó gần giống với Laravel Passport. Laravel Sanctum để cấp quyền truy cập cho người dùng bằng cách tạo mã token được sử dụng để xác thực và cấp quyền truy cập cho người dùng để sử dụng các API Laravel.
   Nếu có thời gian mình sẽ tiếp tục series về xác thực này, có thể bài sau sẽ về Laravel Passport. Cảm ơn mọi người theo dõi

Tài liệu tham khảo : https://laravel.com/docs/8.x/sanctum

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.