Giới thiệu
Trong thời đại phát triển ứng dụng web hiện đại, việc bảo mật và xác thực người dùng là rất quan trọng. Laravel Sanctum, một gói mở rộng mạnh mẽ của Laravel, cung cấp giải pháp đơn giản và hiệu quả để xây dựng và quản lý hệ thống xác thực API an toàn. Trong bài viết này, chúng ta sẽ đi sâu vào cách sử dụng Laravel Sanctum để bảo vệ API của bạn và đảm bảo tính bảo mật cho dữ liệu.
Cài đặt Laravel Sanctum
Để bắt đầu, trước tiên bạn cần cài đặt Laravel Sanctum vào trong ứng dụng Laravel của mình. Bạn chỉ cần chạy lệnh sau trong terminal:
composer require laravel/sanctum
Sau khi việc cài đặt hoàn tất, tiếp theo bạn cần thực hiện một số lệnh Artisan để thiết lập 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 người dùng tạo API token để xác thực danh tính của mình. Điều này cho phép người dùng gửi yêu cầu API chứa token để có thể truy cập 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:
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 tôi đã 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. Sau đó, token đó sẽ được trả lại dưới dạng JSON để người dùng có thể lưu trữ và sử dụng trong 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, bạn có thể sử dụng token này để xác thực các yêu cầu API. Laravel Sanctum cung cấp middleware cho phép bảo vệ các tài nguyên chỉ có thể truy cập khi có token hợp lệ. Để bảo vệ một API với middleware Sanctum, bạn chỉ cần thêm middleware 'auth:sanctum' vào route hoặc controller tương ứng. Dưới đây là ví dụ:
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 trường hợp này, middleware 'auth:sanctum' được thêm vào constructor của controller, bảo vệ tất cả các phương thức trong controller đó. Phương thức getUser
sẽ trả về thông tin 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
Việc xử lý lỗi xác thực trong Laravel Sanctum là rất cần thiết để đảm bảo rằng ứng dụng có thể phản hồi đúng cách khi xảy ra lỗi và cung cấp thông tin cho người dùng. Để 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:
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ụ này, nếu yêu cầu mong đợi nhận kết quả JSON, chúng ta sẽ trả về phản hồi JSON với mã lỗi 401 và thông báo "Unauthenticated". Nếu không, người dùng sẽ được chuyển hướng trở lại trang đăng nhập. Điều này giúp người dùng có hướng xử lý đúng đắn khi gặp sự cố xác thực.
Triển khai xác thực OAuth2 với Sanctum
Ngoài việc sử dụng token, Laravel Sanctum cũng hỗ trợ xác thực OAuth2, cho phép tích hợp với các nhà cung cấp xác thực bên ngoài như Google và Facebook. Để thực hiện điều này, bạn cần sử dụng trait HasApiTokens
trong model người dùng. Hãy đảm bảo rằng model của bạn đã mở rộng từ Illuminate\Foundation\Auth\User
và sử dụng trait này:
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);
}
}
Sau khi đã bổ sung trait HasApiTokens
, trong controller bạn có thể gọi phương thức createTokenWithOAuth
để tạo một token xác thực OAuth cho người dùng:
public function loginWithOAuth(Request $request)
{
$user = User::find(1); // Thay thế bằng cách lấy người dùng từ provider OAuth
$token = $user->createTokenWithOAuth(['scope1', 'scope2'])->plainTextToken;
return response()->json(['token' => $token], 200);
}
Trong ví dụ này, chúng ta sẽ lấy người dùng từ nhà cung cấp OAuth và sau đó tạo token xác thực với các phạm vi mà người dùng đã yêu cầu.
Kết luận
Bài viết này đã hướng dẫn các bạn cách sử dụng Laravel Sanctum để tạo ra hệ thống xác thực API hiệu quả trong ứng dụng Laravel. Chúng ta đã đi qua các bước bao gồm cài đặt, tạo API token, bảo vệ API, xử lý lỗi xác thực, và triển khai xác thực qua OAuth2. Laravel Sanctum chắc chắn sẽ giúp bạn xây dựng ứng dụng web bảo mật và an toàn hơn với khả năng xác thực mạnh mẽ.
source: viblo