Laravelで署名されたURL


プロジェクトでは、ユーザーが何らかの方法でURLを変更しなかったことを確認する必要があるコードを実行するユニークなURLを生成する必要があります.例えば、ニュースレターからユーザーを解雇するか、多分パスワードなしでサインアップするユーザーのためにリンクを作成するかもしれないならば、あなたはあなたの電子メール加入者のために割引を提供したいかもしれません.
あなたのユースケースが何であれ、LALAVELは署名されたURLで働くことを可能にする機能を提供します.

署名URLの生成


署名されたURLを生成するには、名前付きルートを作成する必要があります.例えば、リンクをクリックしたときにユーザを取り消す名前付きルートを作成するつもりです.
// routes/web.php
Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
       ->name('unsubscribe');
さて、署名されたURLを生成するには、URLファサードを使用できます.
use Illuminate\Support\Facades\URL;

return URL::signedRoute('unsubscribe', ['user' => 1]);
The first parameter to the signedRoute メソッドはルートの名前です.ここで私はunsubscribed それが上記のルートを与えた名前です、そして、2番目のパラメタは我々がルート、この場合、ユーザーIDに通過するルートパラメタです.https://yoursite.com/unsubscribe/1?signature=7594beb1a7af889d997eedc50f68eadb8b2e8d4097ba3a9ff1c600ffa8a02e49ご覧のように、ララベルはsignature ハッシュを持つURLへのパラメータ.URLを指定しているので、ユーザーがそのURLの一部を変更するとハッシュが無効になります.

一時的に署名されたURL


また、いくつかの時間が経過した後に期限切れになるURLを作成することもできますtemporarySignedRoute 方法
return URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
);
このメソッドへの2番目のパラメータは、このメソッドを使用してURLが期限切れになる時間ですexpires パラメータはURLに追加され、laravelは無効としてこのURLを報告します.

URLの確認


我々は今署名されたURLを作成しました、しかし、この点まで、我々はハッシュを確かめていません.そのためには、内蔵ミドルウェアを使用できますsigned 我々のルートで.これを行うには、ルート宣言でミドルウェアを追加します.
// routes/web.php
Route::get('/unsubscribe/{user}', [SubscriptionsController::class, 'unsubscribe'])
       ->name('unsubscribe')
       ->middleware('signed');
このミドルウェアを加えることによって、ラーラーベルは自動的にハッシュをチェックして、403のHTTPコードを投げます.

エラーページのパーソナライズ。


URLが無効なときにユーザーが見ているエラーをカスタマイズすることもできます.これは、InvalidSignatureException :
// app\Exceptions\Handler.php
use Illuminate\Routing\Exceptions\InvalidSignatureException;

/**
 * Register the exception handling callbacks for the application.
 *
 * @return void
 */
public function register()
{
    $this->renderable(function (InvalidSignatureException $e) {
        return response()->view('error.link-expired', [], 403);
    });
}
このクロージャの内部では、無効な単一のURLを訪問するときにユーザーが何を表示するかを定義できます.

ミドルウェアなしのURLの検証


場合によっては、コントローラのURLを確認したい場合があります.を削除することでこれを行うことができますsinged あなたのルート定義からのミドルウェアとその代わりにhasValidSignature リクエストで.
public function unsubscribe(Request $request)
{
    if (!$request->hasValidSignature()) {
        abort(401);
    }

    //...
}
私たちがカスタム体験を必要とするならば、これはもう少し柔軟性を許します.