API Authentication trong Laravel
Khi đề cập đến Xác thực trong Laravel, có rất nhiều lựa chọn. Nhưng chúng ta nên sử dụng gì để xác thực API?
Lâu nay, chúng ta có thể sử dụng JSON Web Tokens (JWT) cho việc xác thực API, tương tự như xác thực dựa trên phiên (session-based authentication) cho web. Bạn trao đổi thông tin đăng nhập để nhận được một mã thông báo (token) cho phép bạn truy cập kéo dài.
Sau đó, chúng tôi bắt đầu sử dụng Laravel Passport, một thư viện OAuth tuyệt vời cho phép bạn cung cấp quyền truy cập OAuth cho các ứng dụng Laravel của bạn, bao gồm xác thực từ máy chủ tới máy chủ, xác thực từ thiết bị di động hoặc các hình thức xác thực khác. Trong một thời gian dài, chúng tôi đã sử dụng Laravel Passport và loại cấp quyền Password Grant, cho phép chúng tôi gửi thông tin đăng nhập cùng với chi tiết ứng dụng OAuth, và chúng tôi sẽ nhận lại một mã thông báo truy cập và mã thông báo làm mới (refresh token) – cho phép chúng tôi truy cập và làm mới quyền truy cập khi nó hết hạn. Tuy nhiên, đây không còn được khuyến nghị là cơ chế xác thực như chúng tôi đã từng sử dụng.
Thế bây giờ chúng ta phải làm sao? Sanctum có phải là lựa chọn duy nhất được khuyến nghị không? Thôi, có và không. Sanctum được thiết kế như một sự thay thế nhẹ nhàng cho Passport, nhưng thực tế, nó đã đạt được nhiều hơn thế. Cho dù bạn đang xây dựng một ứng dụng web, triển khai trên client hoặc bất cứ thứ gì ở giữa – sanctum đã nhanh chóng trở thành cơ chế xác thực chuẩn vàng trong hệ sinh thái Laravel.
Tuy nhiên, điều đó có ý nghĩa gì đối với các API? Liệu chúng ta cần chuyển tên token mỗi lần chúng ta muốn xác thực? Chà, bạn có thể làm điều đó – nó không gây hại cho bất kỳ ai. Tuy nhiên, làm thế nào để xác thực các API trong Laravel của tôi?
Hãy cùng đi qua phương pháp của tôi và xem tại sao nó hoạt động/có ý nghĩa. Nó bắt đầu với thông tin đăng nhập của người dùng – giống như bất kỳ cơ chế xác thực phù hợp nào. Chúng ta gửi thông tin này đến các điểm cuối đăng nhập hoặc đăng ký của chúng ta – và Laravel sẽ thực hiện một số phép màu cho chúng ta (tuỳ thuộc vào gói chúng ta sử dụng).
Giả sử chúng ta đang sử dụng Laravel Breeze hoặc Jetstream. Trong trường hợp đó, việc xác thực cung cấp sẽ tạo ra một cookie dựa trên phiên cho chúng ta – mà sau đó, việc triển khai của chúng ta có thể sử dụng cho mỗi yêu cầu tiếp theo để chứng minh trạng thái đã xác thực. Bây giờ, điều này làm tôi bối rối một chút. Tôi tự hỏi token của mình nên đặt ở đâu và tôi có gì bên phía tôi để chứng minh rằng tôi đã được xác thực ngoài việc sử dụng một cookie. Tôi đã quen với việc xử lý token này, hoặc token khác, và tôi có thể sử dụng nó để chứng minh danh tính của mình. Cookies là cho web, phải không? Tôi không nhìn thấy API của mình như là một API web, điều này cho thấy chúng ta có thể đôi khi hơi ngây thơ.
Giả sử tôi muốn xây dựng một ứng dụng CLI, ứng dụng di động hoặc một số tích hợp cần làm việc với hệ thống cục bộ của tôi như một phần mềm có thể cài đặt. Trong trường hợp đó, chúng ta có thể sử dụng Sanctum để chuyển một tên để tạo ra token cần được lưu trữ – điều này cảm thấy tự nhiên. Tuy nhiên, API của chúng ta có thể có tích hợp thông qua một Ứng dụng trang đơn (Single Page Application) – hoặc thậm chí một ứng dụng khác cũng được xây dựng trong Laravel. Phần đó không quan trọng, vì nó không phải là điều chúng ta đang cài đặt.
Cách tiếp cận tốt nhất đối với xác thực là tuân theo những gì tôi gọi là một hướng dẫn đơn giản:
Bạn đang xây dựng một cái gì đó được truy cập, không phải được cài đặt. Trong tình huống này, bạn nên sử dụng Laravel Sanctum với xác thực dựa trên cookie. Một cookie có thể được cấu hình để tồn tại lâu hay ngắn tuỳ thuộc vào nhu cầu truy cập của bạn, và khi truy cập kết thúc, xác thực cũng có thể chấm dứt.
Bạn đang xây dựng một cái gì đó được cài đặt trên thiết bị của người dùng. Đây là nơi chúng ta cần đưa ra một vài lựa chọn. Liệu việc truy cập có phải được kiểm soát dựa trên danh tính không? Nói cách khác – ứng dụng có quyền truy cập vào mọi thứ và không có lớp kiểm soát ủy quyền? Laravel Passport sử dụng thông tin xác thực của khách hàng là một lựa chọn tốt nếu điều này đúng. Laravel Passport có một loại cấp quyền gọi là Client Credentials: bạn xác thực một khách hàng chứ không phải người dùng – vì vậy bất kỳ ai có quyền truy cập vào khách hàng có thể kiểm soát hệ thống. Bạn có thể đưa điều này xa hơn với PKCE, nơi bạn không thể đảm bảo tính bảo mật của bí mật khách hàng.
Nếu bạn cần xác thực một người dùng, không phải một khách hàng – hãy dựa vào Laravel Sanctum và chuyển một tên duy nhất cho ứng dụng đã cài đặt – để bạn có thể lưu trữ token được cung cấp và sử dụng nó lặp đi lặp lại.
Vấn đề lớn nhất khi sử dụng Laravel Sanctum là bạn phải lấy một cookie yêu cầu chéo trang để gửi yêu cầu đến API Laravel của bạn. Khi xây dựng một Ứng dụng trang đơn (SPA), điều này không phải là vấn đề và là cách tiếp cận tốt hơn so với việc lưu trữ một JSON web token trong local storage.”