讨论数量:
签名 URL
Laravel 允许你轻松地为命名路径创建「签名」URL,这些 URL 在查询字符串后附加了「签名」哈希,允许 Laravel 验证 URL 自创建以来未被修改过。签名 URL 对于可公开访问但需要一层防止 URL 操作的路由特别有用。
例如,你可以使用签名 URL 来实现通过电子邮件发送给客户的公共「取消订阅」链接。要创建指向路径的签名 URL ,请使用 facade 的 signedRoute
方法 URL
:
use Illuminate\Support\Facades\URL;
return URL::signedRoute('unsubscribe', ['user' => 1]);
如果要生成过期的临时签名路由 URL ,可以使用以下 temporarySignedRoute
方法:
use Illuminate\Support\Facades\URL;
return URL::temporarySignedRoute(
'unsubscribe', now()->addMinutes(30), ['user' => 1]
);
验证签名路由请求
要验证传入请求是否具有有效签名,你应该调用 hasValidSignature
传入的方法 Request
:
use Illuminate\Http\Request;
Route::get('/unsubscribe/{user}', function (Request $request) {
if (! $request->hasValidSignature()) {
abort(401);
}
// ...
})->name('unsubscribe');
或者,你可以将 Illuminate\Routing\Middleware\ValidateSignature
中间件分配给路由。如果它不存在,则应该在 HTTP 内核的 routeMiddleware
数组中为此中间件分配一个键:
/**
* 应用程序的路由中间件
*
* 这些中间件可能被分配给组或单独使用
*
* @var array
*/
protected $routeMiddleware = [
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
];
在内核中注册中间件后,你可以将其附加到路由中。如果传入请求没有有效签名,则中间件将自动返回 403
错误响应:
Route::post('/unsubscribe/{user}', function (Request $request) {
// ...
})->name('unsubscribe')->middleware('signed');
然后结合 Redis set 的 key 增加一次性查看就好了
推荐文章: