4. Signed URL (ok)

https://viblo.asia/p/tap-18-url-laravel-gDVK2pyjlLj

Nói một chút về "Signed URL", đây là một dạng URL được đăng ký tồn tại trong một thời gian nhất định, bao gồm các mã token. Thường được ứng dụng để làm liên kết đổi mật khẩu, xác thực thông tin hoặc đơn giản là chuỗi token xác thực trong mỗi request admin-side.

Laravel cho phép chúng ta dễ dàng tạo một "signed URL" với các named route. Các signed URL này có mã token nối với query signature xác minh rằng URL này là duy nhất. Ví dụ giờ chúng ta đăng ký singed URL cho route đổi mật khẩu người dùng. Với method signedRoute của URL facade, ta có thể dễ dàng đăng ký một signed URL cho bất cứ named route nào.

use Illuminate\Support\Facades\URL;

URL::signedRoute($nameRoute, $dataParameters);

Method signedRoute này sẽ nhận hai tham số:

  • Tham số thứ nhất chính là name route mà bạn muốn tạo signed URL.

  • Tham số thứ hai (tùy chọn) là các dữ liệu truyền cho tham số URI của route.

Nếu ứng dụng bạn cần quy định thời gian tồn tại cho các signed URL thì bạn có thể sử dụng method temporarySignedRoute.

use Illuminate\Support\Facades\URL;

URL::temporarySignedRoute($nameRoute', now()->addMinutes($minutes), $dataParameters);

Khác với signedRoute, phương thức này sẽ thêm một tham số thời gian tồn tại của signed URL dưới dạng datetime. Bạn có thể sử dụng các method addSeconds, addHours... để tùy biến giới hạn thời gian.

Bây giờ chúng ta sẽ bắt tay vào thử nghiệm, ta sẽ tạo hai route sau:

use Illuminate\Support\Facades\URL;

Route::get('/create', function() {
    return URL::signedRoute('change_password', ['user' => 1]);
});

Route::get('change_password/{user}', function($user) {
    return 'Change password user ' . $user;
})->name('change_password')->middleware('signed');

Với route /create ta dùng để tạo signed URL. Tại named route change_password, các bạn để ý mình đã đăng ký middleware signed. Nếu bạn thắc mắc không biết middleware này ở đâu thì bạn có thể mở file app/Http/Kernel.php và quan sát tại mảng $routeMiddleware.

protected $routeMiddleware = [
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];

Middleware này có công dụng sẽ kiểm tra xem URL truy cập vào route có phải là một signed URL xác thực hay không, nếu khớp thì nó sẽ cho phép truy cập route, còn không thì nó sẽ trả về trang lỗi 403.

Chẳng hạn giờ bạn thử truy cập đường dẫn http://localhost:8000/change_password/1 xem, chắc chắn sẽ nhận được như thế này:

Lý do là bạn đã đăng ký middleware signed cho named route này nên khi URL không có mã token xác thực thì nó sẽ không cho phép bạn truy cập.

Bậy giờ hãy thử tạo signed URL thông qua route /create, ta sẽ nhận được đường dẫn để có thể truy cập named route change_password.

Như bạn thấy, phía sau có kèm thêm query signature với giá trị là một mã token nào đó. Giờ hãy thử truy cập đường dẫn này, ta sẽ có thể vào được route change_password.

Ngoài ra, nếu bạn muốn tùy chọn kết quả tra về nếu như chứng thực sai thì có thể làm như sau:

use Illuminate\Http\Request;

Route::get('/change_password/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        // Chưa xác thực
    }

    // ...
})->name('change_password');

Như vậy thay vì trả về lỗi 403 mặc định, bạn có thể tùy chỉnh theo ý của mình.

Lưu ý: Signed URL của từng named route chỉ khởi tạo một lần trong phiên làm việc trình duyệt đối với mỗi người dùng.

IV. URL của controller ac

Last updated