Authentication trong Laravel – Thầy Long Web

Authentication trong Laravel hướng dẫn cài đặt , sử dụng các chức năng user như đăng nhập, đăng ký, kiểm tra user đăng nhập…

Authentication trong Laravel

Hoạt động xác thực người dùng luôn cần phải có trong các website, Authentication chính là nó. Mục đích là để xác minh rõ ai đang truy cập vào, để làm căn cứ cho/cấm sử dụng các chức năng trong hệ thống.

Đây là hoạt động cần phải có trong hầu hết các website. Cho nên Laravel đã cung cấp sẵn tiện ích này cho Bạn, giúp Bạn triển khai authentication rất nhanh chóng và dễ dàng.

Cấu hình authentication

Thực hiện Authentication trong Laravel sẽ cần tương tác với bảng users. Cho nên Laravel đã tạo sẵn model User cho mục đích này, bạn dùng nó để thực hiện cấu hình, khỏi tạo mới model.

Các cấu hình cho hoạt động authentication được khai báo trong file config/auth.php. Mặc định guard web (có thể tạo thêm) được dùng để xác thực user qua model Eloquent User, thông tin lưu vào session

Các Starter kit trong Laravel

Starter Kit là các gói bổ sung cho các dự án Laravel (miễn phí) giúp triển khai authentication được nhanh chóng. Các gói này gồm:

Laravel Breeze là gói đơn giản, gồm các chức năng register, login,, password reset, email verification và password confirm.

Laravel Fortify là gói triển khai authentication cho backend. Gồm authentication bình thường và có thêm two-factor authentication.

Laravel Jetstream: có các tính năng như Fortify nhưng UI đẹp hơn đi cùng với Tailwind CSS, Livewire, Inertia.js. Jetstream có two-factor authentication, browser session management, profile management, built-in sẵn Sanctum để API token authentication

Sử dụng Laravel Breeze

Để triển khai sử dụng Breeze, bạn thực hiện như sau:

B1: Tạo 1 project mới và cấu hình kết nối đến database.

B2: Tải breeze vào project với lệnh:

composer require laravel/breeze --dev

B3: Cài breeze để tạo views, routes, controllers, resources với các lệnh sau:

php artisan breeze:install
npm install
npm run dev

B4: Tạo các table trong database, nhớ cấu hình tên database trong file .env cho đúng trước khi chạy lệnh sau nhé.

php artisan migrate

Xem kết quả cài đặt Breeze

– Khi cài Breeze xong, Bạn vào folder app\Http\Controllers\Auth sẽ thấy các controller phục vụ authentication:

– Tiếp tục vào trong folder resources\views\auth cũng sẽ thấy các views sau được tạo ra:

– Mở file routes\auth.php sẽ thấy nhiều route được tạo :

Test các chức năng authentiocation

Để test các chức năng được tạo ra như đăng ký, đăng nhập … Bạn xem các route như hình trên để nhập địa chỉ. Ví dụ nhập thử các địa chỉ sau:

http://localhost:8000/register  => đăng ký thử sẽ có user mới trong table users.
http://localhost:8000/login  => đăng nhập thử với user mới đăng ký sẽ vào được.

Với chức năng forgot-password, Bạn cần phải cấu hình trước thông sối mail như sau:

1.Mở file .env, cấu hình các thông số gửi mail như gợi ý

2.Mở trình duyệt gõ http://localhost:8000/forgot-password 

4.Nhập vào 1 email có thật và đang có trong bảng users rồi nhắp nút Email Password Reset Link
Một token sẽ được sinh ra và lưu vào table password_resets , đồng thời 1 email sẽ được gửi tới hộp thư

Chú ý: để gửi email thành công, hộp thư gửi mail khai báo trong file .env phải bật tính năng 2-step Verification và tạo App password nhé . Gợi ý như sau: Vào Manage your Google Account => Security => Bật On trong 2-step verification

Còn khi tạo App passwords, hãy chọn Other (Custom name) , sau đó đặt tên ứng dụng (tùy ý) và nhắp nút Generate sẽ được google phát sinh pass cho bạn dùng trong ứng dụng.

Vậy là cài đặt vào rồi xài, dễ quá phải không. bạn custom thêm giao diện trong các view và định dạng thêm cho đẹp. Khung sườn đã có, bạn có thể thêm các thông tin mới cho 1 user khi đăng ký như ngày sinh, giới tính, nghề nghiệp…

Sử dụng Laravel Jetstream

Vừa rồi là sử dụng Breeze, còn một gói starter kit khác có tên là Jetstream. Giờ thì cài và sử dụng thử, thực hiện theo các bước như sau:

B1: Tạo project mới  và chỉnh cấu hình kết nối đến db

B2: Tải Jetstream: Trong folder project và chạy lệnh: 

composer require laravel/Jetstream 

B3: Cài jetstream (để tạo views, routes, controllers) bằng cách chạy các lệnh

php artisan jetstream:install livewire 
npm install
npm run dev

B4: Chạy migrate để tạo các table

  • Tạo database trong mysql và khai báo kết nối đến db trong file .env
  • Chạy lệnh sau:
php artisan migrate

Xem kết quả cài jetstream

Cài Jetstream xong, vào folder app\Actions sẽ thấy 2 folder con

Nếu muốn chèn user  thì mở file database\seeders\DatabaseSeeder.php , bỏ khóa cho lệnh đang có trong hàm run.

Xong thì chạy php artisan db:seed sẽ có 10 user trong bảng users (mỗi user có mật khẩu là password)

Gõ lệnh sau để thấy các route được Jetstream hỗ trợ

php artisan route:list

Trong routes\auth.php sẽ thấy các route được tạo ra

Test hoạt động jetstream

Chạy project với lệnh php artisan serve rồi mở trình duyệt xem thử địa chỉ: http://localhost:8000/login => đăng nhập thử nhé. OK đó.

Mở chức năng profile, có thể cập nhật thông tin, đổi pass, bật xác thực 2 yếu tố…

Cấu hình xác thực hai lớp

JetStreame hỗ trợ authen 2 lớp cho user. User nào muốn thì có thể cấu hình bằng cách như sau:

  • Vào Profile => mục Two Factor Authentication nhắp Enable (xem hình trên)
  • Nhập vào code rồi nhắp Confirm (làm sao để có code thì xem phía dưới)

  • Để có code mà nhập trong hình trên, bạn mở ứng dụng Google Authenticatior trên điện thoại (chưa có thì cài vào từ CH Play) rồi quét mã QR code ở trên. Sau khi quét thì lấy mã do Google Authenticator phát sinh gồm 6 số và nhập vào trong mục Code ở hình trên là xong.
  • Khi kết thúc, JetStream sẽ cung cấp 1 số mã hồi phục, lưu các số này lại để cứu tài khoản khi bị mất thiết bị.

Đăng nhập khi đã bật xác thực hai lớp

Khi đã bật xác thực hai lớp, user đăng nhập như bình thường. Nhưng khi user + pass nhập đúng thì chỉ mới là bước 1, bước tiếp theo ứng dụng sẽ yêu cầu nhập code. Để có code thì user phải mở ứng dụng Google Authenticator trên điện thoại lấy mã code( 5 phút đổi 1 lần) để nhập vào thì mới đăng nhập thành công.

Xác định user đã login hay chưa

Authentication trong Laravel sẽ lưu thông tin user khi đã đăng nhập thành công trong class Auth, và cung cấp hàm check() để xác định tình trạng đăng nhập của user.

Cụ thể, để xác định user đã đăng nhập hay chưa, sử dụng hàm check() của class Auth như sau:

use Illuminate\Support\Facades\Auth;
if (Auth::check()) {
     // The user is logged in...
}

Hàm check() thường dùng để xử lý ẩn hiện thông tin trong web. Còn để bảo vệ cho các chức năng của website, bạn có cách hay hơn đó là dùng middleware

Lấy thông tin của user đã đăng nhập

Để lấy thông tin của user đã đăng nhập, bạn dùng hàm user() của class Auth như sau:

use Illuminate\Support\Facades\Auth;
$user = Auth::user(); //lấy thông tin của user đang đăng nhập
$id = Auth::id(); // chỉ lấy id của user đang đăng nhập

Cách khác là truy xuất trong đối tượng request.

use Illuminate\Http\Request;
class FlightController extends Controller {
    public function update(Request $request)  {         
       $u = $request->user();  //thông tin user đang login
    }
}

Mời xem ví dụ về check user login và lấy thông tin user

  • Trong routes/web.php định nghĩa route:
Route::get('/test', function () {
    return view('test');
});
  • Tạo file test.blade.php và code
@if (Auth::check())
   <h2>Chào bạn {{Auth::user()->name}}</h2>
@else
 <h2>Chào quý khách</h2>
@endif
  • Test: khi user chưa đăng nhập sẽ thấy chữ Chào quý khách, còn khi đã đăng nhập sẽ thấy chữ Chào bạn …

Route protect – bảo vệ chức năng

Route nào trong website muốn chỉ phục vụ cho những user đã đăng nhập, hoặc chỉ cho phép admin vào thì Bạn sử dụng middleware trong route như sau:

Route::get('/download', function () {
 // Chỉ user đã đăng nhập mới vào được route này
 return view('download'); 
})->middleware('auth');

Bạn test thử: khi đã có middleware auth cài vào route. Xem thừ route /download sẽ thấy view nếu đã đăng nhập thành công, còn nếu chưa đăng nhập sẽ thấy form đăng nhập hiện ra.

Chú ý: có thể chỉ định nhiều middleware khi cần bảo vệ route

Route::get('/download', function () {
 // Chỉ user đã đăng nhập mới vào được route này
})->middleware('auth','admin');

Chuyển hướng user chưa đăng nhập

Khi auth middleware xác định chưa đăng nhập, nó sẽ chuyển user đến route có name là login. Bạn có thể chỉnh đến route khác trong file app/Http/Middleware/Authenticate.php

Http basic authentication

Bạn có thể sử dụng HTTP Basic Authentication – phương pháp xác thực đơn giản mà không cần dùng trang login. Middlewate này sử dụng email để xác thực người dùng.

Để sử dụng HTTP bacsic Authentication, Bạn khai báo trong 1 route như sau:

Route::get('/chao', function () {
    echo "Chào bạn";
})->middleware('auth.basic');

Logout – Thoát

Để tạo chức năng thoát bằng tay,  sử dụng hàm logout() của class Auth. Có Khi thoát, có thể redirect  user đến route nào tùy ý.

  • Định nghĩa hàm logout trong controller rồi routing vào:

  • Hoặc định nghĩa ngay trong route nếu muốn
Route::get("/thoat", function(){
    Auth::logout();
    return redirect("/");
});

Laravel authentication events

Quá trình xác thực của Laravel phát sinh nhiều sự kiện, có thể lắng nghe các sự kiện trong app\Providers\EventServiceProvider.php

Authentication trong Laravel là việc quan trọng phải làm trong hầu như mọi website. Bạn xem thêm thông tin ở trang này : https://laravel.com/docs/9.x/authentication . Còn bài tiếp theo cần xem là Middleware trong Laravel, mời bạn tiếp tục nhé.