# laravel URL https://hackmd.io/@javck/ByJgF8HRP/%2F6ZXmzI-yTk-1VEWpRUCYYA ## 簽名 URLs Laravel 允許你輕鬆地為命名路徑創建「簽名」URL,這些 URL 在查詢字串後附加了「簽名」Hash,允許 Laravel 驗證 URL 自創建以來未被修改過。簽名 URL 對於可公開訪問但需要一層防止 URL 操作的路由特別有用。 例如,你可以使用簽名 URL 來實現通過電子郵件發送給客戶的公開「取消訂閱」連結。要創建命名路由的簽名 URL ,請使用 URL Facade 的 signedRoute() ``` use Illuminate\Support\Facades\URL; return URL::signedRoute('unsubscribe', ['user' => 1]); ``` 如果要生成具有有效期的臨時簽名路由 URL,可以使用 temporarySignedRoute() 。當 Laravel 驗證一個臨時簽名路由 URL,它將確保被加入在簽名 URL 的過期時間戳記還沒有被改動 ``` use Illuminate\Support\Facades\URL; return URL::temporarySignedRoute( 'unsubscribe', now()->addMinutes(30), ['user' => 1] ); ``` 驗證簽名路由請求 要驗證傳入請求是否具有有效簽名,你應該對傳入的 Request 呼叫 hasValidSignature() ``` use Illuminate\Http\Request; Route::get('/unsubscribe/{user}', function (Request $request) { if (! $request->hasValidSignature()) { abort(401); } // ... })->name('unsubscribe'); 或者,你可以將 ```Illuminate\Routing\Middleware\ValidateSignature 中介層分配給路由。如果它不存在,則應該在 HTTP 內核的 routeMiddleware 陣列中為此中介層分配一個鍵 ``` ``` /** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, ]; ``` 在內核中註冊中介層後,你可以將其附加到路由中。如果傳入請求沒有有效簽名,則中介層將自動返回 403 錯誤回應 ``` Route::post('/unsubscribe/{user}', function (Request $request) { // ... })->name('unsubscribe')->middleware('signed'); ``` ###### tags: `Laravel`