LoginSignup
73
58

More than 5 years have passed since last update.

Laravel5.6で署名付きURL(時間制限付き)の実装が簡単に出来るようになったので試した

Last updated at Posted at 2018-04-07

Laravel5.6で署名付きURL(時間制限付き)の実装が簡単に出来るらしい

署名付きURLは実際のプロダクトで使用する機会も多いし、
時間制限付きの1時間以内にクリックしてくださいとかよくあるので、
簡単に実装できると凄くありがたいので試した。

公式の機能で追加になったらしいので、とりあえず確かめて見る。

以下のドキュメントを参考にした。
URL Generation

環境

  • PHP 7.1.16
  • Laravel Framework 5.6.15

実装

app/Http/Kernelに以下を記載する。

app/Http/Kernel.php
protected $routeMiddleware = [

    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,

];

あとは例に合わせてURLを作って、viewでリンクを作ってみる。

SignedRoute(...)・・・署名付きURL生成
temporarySignedRoute(...)・・・署名付きURL生成(時間制限付き)

今回は時間制限付きを試したいのでtemporarySignedRouteを使う。

  • 実際に実装で使いそうなuseridを指定している。(とりあえず固定で1)
  • 第2引数に有効時間を設定。下記の例は5秒以内にクリックしないとエラーになる。(now()->addSeconds(5))
routes/web.php
use Illuminate\Support\Facades\URL;
use Illuminate\Http\Request;

Route::get('/', function () {
    // URL生成
    $url = URL::temporarySignedRoute('unsubscribe', 
                                      now()->addSeconds(5), 
                                      ['user' => 1]);

    // とりあえずwelcomページにリンクを出して見る
    return view('welcome')->with('url',$url);
});

そして上の設定のルート先の内容が以下。
5秒以内にリンクをクリックすると、view('safe')のページが出る。
5秒以降のエラー遷移は->middleware('signed');がやってくれる。

routes/web.php
Route::get('/unsubscribe/{user}', function (Request $request) {

    return view('safe');

})->name('unsubscribe')->middleware('signed');

エラー遷移は->middleware('signed');がやってくれる。と書いたが、
このミドルウェアは自動的に403エラーレスポンスを返すと書いてあるので
resources/views/errors/403.blade.phpを用意した。

動作確認

まず、ルート画面に生成したURLを埋め込むと、以下のようなリンクが出た。

http://.../unsubscribe/1?expires=1523128426&signature=63b4744eb3aea943ddd7411d92bf2d8cea528dda011e29a9da128fac5c7e8ab7
  • 5秒以内にクリック
    view('safe')の画面が表示された。

  • 5秒以降にクリック
    403エラーの画面が表示された

validation

また実際に使いそうな処理としてvalidation判定して処理を分ける場合は、
$request->hasValidSignature()を使うため、->middleware('signed');を外した。
今度は401エラーを使いたいのでresources/views/errors/401.blade.phpを用意して確認した。

routes/web.php
Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }
    return view('safe');

})->name('unsubscribe');
  • 5秒以内にクリック
    view('safe')の画面が表示された。

  • 5秒以降にクリック
    401エラーの画面が表示された

結果

本当に簡単に実装できた。時間制限設定も簡単。
今後、Laravel5.6以上で1時間以内にクリックとかでURLメール送る機能とかを作る時が来たら使って見る。

73
58
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73
58