Triển khai Invite-only registrations sử dụng Laravel's signed URLs Chuyên mục PHP và Laravel 2023-07-27 409 Lượt xem 77 Lượt thích 0 Bình luận

Sẽ có lúc bạn muốn các URL công khai nhưng bạn vẫn muốn một số loại xác thực giống nhau. Chẳng hạn, bạn muốn loại URL như vậy cho phép đăng ký chỉ dành cho người được mời cho ứng dụng của mình, nơi bạn sẽ gửi URL tới người dùng mà chỉ người cụ thể đó mới có thể truy cập và đăng ký. Trong những trường hợp như vậy, signed URLs có thể hữu ích, đây là loại URL đặc biệt có hàm băm "signature (chữ ký)" được thêm vào chuỗi truy vấn để xác minh rằng URL chưa bị sửa đổi kể từ khi được tạo.
Laravel 5.8 đi kèm với khả năng dễ dàng tạo các URL “signed” cho các named route. Chúng ta sẽ tìm hiểu cách bạn có thể triển khai từng bước các signed routes.
Routes
Trước hết, hãy tạo một route mà người dùng sẽ được đăng ký và sẽ là một route đã ký trong tệp routes/web.php.
Route::get('/register/{id}', function () {
return view('registerSuccess');
})->name('register');
Như bạn có thể thấy ở trên, chúng ta có một name route được đặt tên là "register" mà chúng ta sẽ sử dụng tại thời điểm signing.
Sau đó, chúng ta sẽ tạo một route sẽ trả về route signed ( đã ký ) mong muốn cho người dùng cụ thể.
Route::get('/user/{id}', 'UserController@getSignedUrl');
Controller
Bây giờ, như được hiển thị trong route trên, chúng ta sẽ tạo UserController và trong đó một phương thức có tên getSignedUrl sẽ trả về cho chúng ta URL signed để đăng ký người dùng.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\URL;
class UserController extends Controller
{
/**
* Return the signed URL of the specified user
*
* @param int $id
* @return View
*/
public function getSignedUrl($id)
{
echo URL::signedRoute('register', ['user' => $id]);
}
}
Như bạn có thể thấy ở trên, chúng ta có thể tạo một URL đã ký cho một route được đặt tên bằng cách sử dụng phương thức signedRoute của URL Facade.
Đoạn mã trên sẽ tạo URL sau cho người dùng được chỉ định: http://127.0.0.1:8000/register?user=2&signature=4a46863bb35054c0d8d2d99f4701b65c4384ae393a39a4b7bca55e87be1133f3
Như bạn có thể thấy, URL có hai tham số user và signature được thêm vào dưới dạng chuỗi truy vấn cho phép Laravel xác minh rằng URL không bị sửa đổi kể từ khi nó được tạo.
Validating Signed Route Requests
Tiếp theo, để xác minh xem incoming request có chữ ký hợp lệ hay không, chúng ta sẽ cần gọi phương thức hasValidSignature trên. Vì vậy, hãy quay lại tệp routes/web.php và thêm đoạn mã sau vào `register route'.
Route::get('/register/{id}', function () {
if (! $request->hasValidSignature()) {
abort(401);
}
return view('registerSuccess');
})->name('register');
Validating sử dụng ValidateSignature route middleware
protected $routeMiddleware = [
...
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];
Và sau đó, tất cả những gì chúng ta cần làm là đính kèm middleware này vào route đăng ký của mình và middleware sẽ tự động trả về phản hồi lỗi 403 nếu yêu cầu đến không có chữ ký hợp lệ.
Route::get('/register/{id}', function () {
return view('registerSuccess');
})->name('register')->middleware('signed');


chúng
Bình luận (0)