Giới thiệu
Trong phát triển ứng dụng web hiện đại, việc xác thực người dùng và bảo mật dữ liệu là một yêu cầu quan trọng. Laravel Sanctum, một gói mở rộng của Laravel, cung cấp cho chúng ta một cách dễ dàng để xây dựng và quản lý hệ thống xác thực API. Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng Laravel Sanctum và áp dụng nó vào phát triển ứng dụng web.
Cài đặt Laravel Sanctum
Trước khi bắt đầu sử dụng Laravel Sanctum, chúng ta cần cài đặt nó vào ứng dụng Laravel của mình. Đầu tiên, chạy lệnh composer để cài đặt gói Sanctum:
composer require laravel/sanctum
Sau khi cài đặt thành công, chúng ta cần chạy các lệnh Artisan để triển khai cơ sở dữ liệu cho Sanctum:
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate
Tạo API tokens cho người dùng
Laravel Sanctum cho phép chúng ta tạo ra các API token để xác thực người dùng. Điều này cho phép người dùng gửi các yêu cầu API có chứa token để xác nhận danh tính và truy cập vào các tài nguyên bảo mật.
Dưới đây là ví dụ về cách đăng ký người dùng và tạo token xác thực trong Laravel:
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash; public function register(Request $request)
{ $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|min:6', ]); $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); $token = $user->createToken('api-token')->plainTextToken; return response()->json(['token' => $token], 201);
}
Trong ví dụ trên, chúng ta sử dụng phương thức createToken của đối tượng người dùng để tạo ra một token xác thực mới có tên là 'api-token'. Sau đó, chúng ta trả về token đó dưới dạng JSON để người dùng có thể lưu trữ và sử dụng cho các yêu cầu API tiếp theo.
Xác thực người dùng và bảo vệ API
Sau khi người dùng đã có token xác thực, chúng ta có thể sử dụng nó để xác thực các yêu cầu API. Laravel Sanctum cung cấp middleware để bảo vệ các tài nguyên chỉ có thể truy cập khi có token hợp lệ được gửi kèm yêu cầu.
Để bảo vệ một API bằng middleware Sanctum, chúng ta cần thêm middleware 'auth:sanctum' vào route hoặc controller tương ứng. Dưới đây là ví dụ về cách bảo vệ một API và truy cập thông tin người dùng trong Route và Controller tương ứng:
Route::middleware(['auth:sanctum'])->group(function () { // ...
});
use App\Http\Controllers\Controller;
use Illuminate\Http\Request; class ApiController extends Controller
{ public function __construct() { $this->middleware('auth:sanctum'); } public function getUser(Request $request) { $user = $request->user(); return response()->json(['user' => $user], 200); }
}
Trong ví dụ trên, chúng ta đã thêm middleware 'auth:sanctum' vào constructor của controller để bảo vệ tất cả các phương thức trong controller đó. Phương thức userInfo trả về thông tin của người dùng hiện tại dựa trên token xác thực.
Xử lý lỗi xác thực
Phần xử lý lỗi xác thực trong Laravel Sanctum là một phần quan trọng để đảm bảo ứng dụng xử lý các lỗi một cách đúng đắn và cung cấp phản hồi phù hợp cho người dùng. Trong ứng dụng Laravel, phần xử lý lỗi được định nghĩa trong class Handler, một class mở rộng từ Illuminate\Foundation\Exceptions\Handler.
Để tùy chỉnh xử lý lỗi xác thực, chúng ta cần ghi đè phương thức unauthenticated trong class Handler. Phương thức này được gọi khi xác thực không thành công và người dùng không có quyền truy cập vào tài nguyên.
Dưới đây là một ví dụ về cách tùy chỉnh xử lý lỗi xác thực trong class Handler:
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler
{ protected function unauthenticated($request,AuthenticationException $exception) { if ($request->expectsJson()) { return response()->json(['message' => 'Unauthenticated'], 401); } return redirect()->guest('login'); }
}
Trong ví dụ trên, chúng ta kiểm tra nếu yêu cầu mong đợi nhận kết quả JSON ($request->expectsJson()), chúng ta trả về một phản hồi JSON với mã lỗi 401 và thông báo "Unauthenticated". Điều này thường xảy ra khi yêu cầu API không có token xác thực hợp lệ hoặc token đã hết hạn.
Nếu yêu cầu không mong đợi kết quả JSON, chúng ta chuyển hướng người dùng đến trang đăng nhập (return redirect()->guest('login')). Điều này phù hợp cho các ứng dụng web thông thường khi người dùng không xác thực hoặc token xác thực không hợp lệ, chúng ta chuyển hướng họ đến trang đăng nhập để thực hiện quy trình xác thực.
Bằng cách tùy chỉnh xử lý lỗi xác thực trong class Handler, chúng ta có thể tuỳ chỉnh phản hồi lỗi và hành động tương ứng với yêu cầu từ phía người dùng khi xác thực không thành công.
Lưu ý rằng, sau khi thay đổi xử lý lỗi trong class Handler, chúng ta cần chạy lệnh php artisan optimize
để cập nhật các thay đổi trong ứng dụng Laravel.
Triển khai xác thực OAuth2 với Sanctum
Ngoài xác thực thông qua token, Laravel Sanctum cũng hỗ trợ xác thực OAuth2. Điều này cho phép chúng ta tích hợp với các nhà cung cấp xác thực bên ngoài như Google hoặc Facebook.
Để triển khai xác thực OAuth2 với Sanctum, bạn cần sử dụng trait HasApiTokens trong model người dùng (User). Đảm bảo rằng model người dùng đã mở rộng từ Illuminate\Foundation\Auth\User và sử dụng trait HasApiTokens.
use Laravel\Sanctum\HasApiTokens;
use Laravel\Sanctum\NewAccessToken; class User extends Authenticatable
{ use HasApiTokens; public function createTokenWithOAuth(array $scopes): NewAccessToken { return $this->createToken('oauth-token', $scopes); }
}
Trong ví dụ trên, chúng ta đã thêm trait HasApiTokens vào model User. Đồng thời, chúng ta đã tạo một phương thức createTokenWithOAuth để tạo token xác thực với OAuth. Phương thức này sẽ tạo một token với tên là oauth-token và phạm vi xác thực đã được chỉ định.
Sau đó, trong controller, bạn có thể sử dụng phương thức createTokenWithOAuth để tạo token xác thực OAuth cho người dùng:
public function loginWithOAuth(Request $request)
{ $user = User::find(1); // Lấy người dùng từ OAuth provider $token = $user->createTokenWithOAuth(['scope1', 'scope2'])->plainTextToken; return response()->json(['token' => $token], 200);
}
Trong ví dụ trên, chúng ta lấy người dùng từ nhà cung cấp OAuth (ví dụ: Google hoặc Facebook), sau đó sử dụng phương thức createTokenWithOAuth để tạo một token xác thực cho người dùng với các phạm vi xác thực đã chỉ định. Cuối cùng, chúng ta trả về token dưới dạng JSON trong phản hồi.
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu về cách sử dụng Laravel Sanctum và API xác thực trong phát triển ứng dụng web. Chúng ta đã cài đặt Sanctum, tạo token xác thực cho người dùng, bảo vệ API và xử lý lỗi xác thực. Chúng ta cũng đã xem qua cách triển khai xác thực OAuth2 với Sanctum.
Laravel Sanctum cung cấp một cách dễ dàng và mạnh mẽ để xác thực API trong ứng dụng Laravel của bạn. Với việc áp dụng các khái niệm và ví dụ trong bài viết này, bạn có thể tạo ra các ứng dụng web an toàn và bảo mật với xác thực API mạnh mẽ.