BackEnd

Laravelでの署名付きURL生成

投稿日:2021年11月29日 更新日:

はじめに

Webアプリケーションでは、署名付きURLを使用してURLリンクが改竄されていないか確認したい場面が出てくると思います。例えば、各ユーザー用にサービスの退会や購読の中止を行うAPIのリンクなどでよく使用されると思います。

Laravelではこういう場面で使用出来る署名付きURLを簡単に生成出来るので、紹介したいと思います。

今回のサンプル

以下のようなシンプルなビューを作成して、署名付きURLを生成して、利用してみたいと思います。
各ボタンをクリックするとURLが生成されて表示されます。
生成されたURLをクリックすると、署名確認を行い問題無ければsucceed画面に遷移します。
署名確認が出来ないと、403エラー画面に遷移します。

ビュー

シンプルに作成します。

ルーティング

署名付きURLの生成には、名前付きルートが必要なのでルーティング設定しておきます。ここでは unsubscribe と名前付けています。

コントローラー

署名付きURLの生成

URLファサードの signedRoute メソッドを使用します。第一引数にルート名、第二引数に任意のクエリパラメーターを付与できます。
サンプルでは、 user_id=1234 のクエリパラメーターを付与してます。

サンプルでは、 http://localhost:8080/unsubscribe/result?user_id=1234&signature=cf2c234bef0a53b1c2efcc2dfa67263e5fc004a619a42230d2fb486d084216de というURLが生成されます。
このリンクのクエリパラメーターのuser_idかsignatureの値を変更してクリックしてみると、署名の確認に失敗して403エラーが返却されます。

期限ありの署名付きURLの生成

URLファサードの temporarySignedRoute メソッドを使用します。第一引数にルート名、第二引数に有効期限、第三引数に任意のクエリパラメーターを付与できます。
サンプルでは、 $expire = now()->addMilliseconds(3000); で、有効期限を3秒としています。

サンプルでは、 http://localhost:8080/unsubscribe/result?expires=1637952579&user_id=1234&signature=af4b315820de0aff1274d9abf0857115289a5285db1a5f5ee6d893bec3dcde87 の様なURLが生成されます。
expiresは有効期限なので、生成の度に値が変わります。
こちらもクエリパラメーターの値を変更したり、有効期限経過後(サンプルは3秒)にクリックしてみると、署名の確認に失敗して403エラーが返却されます。

署名のチェック

ミドルウェアを使用します。Kernel.phpの$routeMiddlewareに記載されてなければ追記します。 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class

ミドルウェアでは hasValidSignature メソッドを使用して、署名のチェックを行っています。

おまけ

署名の仕組

署名の確認方法ですが、URL生成時は、signatureのクエリパラメーターを除いたURLをハッシュ化した値をsignatureに持たせています。
署名確認時も同様に、signatureのクエリパラメーターを除いたURLをハッシュ化した値を、クエリパラメーターのsignatureの値と比較して、改竄されているかどうかを確認しています。
意外とシンプルなロジックの様です。興味のある方は、メソッドの中身を一度見てみてみるとすぐに分かるかと思います。

さいごに

有効期限ありの署名付きURLを簡単に生成することが出来ました。
よくあるメールでユーザー個別のURLリンクを送信する事も、サンプルの応用で簡単に出来そうです。

おすすめ書籍

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応 動かして学ぶ!Laravel開発入門

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA


関連記事

Go言語

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーションには、少なからず、何らかの状態変化を管理するコードが含まれていると思います。 それが、管理する状態が少なかったり簡単である場合は、 if や case を使って処理す ...

PHPerだけどKotlinを勉強したって良いよね その2〜コンストラクタ編〜

はじめに 前回、PHPerだけどKotlinを勉強したって良いよね その1〜クラス編〜の続きになります。 今回はKotlinにおけるクラスのコンストラクタになります。 勉強に使った本はKotlinイン ...

rails

Rails Developer Meetup に参加してきました【1日目】

はじめに 3月24日、25日に開催された、Rails Developer Meetup に参加させていただきました。 多くの発表を聞くことができ、とても有意義な時間を過ごすことができました。 本日は、 ...

Go言語

Go言語の基礎〜基本構文その2〜

はじめに 昨日に引き続きGo言語の連載3回目です。 基本構文その1より個人的にはGoの特色が出ているだろう基本文法に関して紹介させていただきます。 配列 Goの配列は固定長です。可変長配列は後述するス ...

Go言語

sqlcを使ってSQLファイルからGoのコードを生成する

はじめに Goでデータベースにアクセスする場合、様々なやり方(ORMを使う、クエリを直接書いて実行する等)がありますが、それぞれ良さと辛みがあると思います。 個人的には、RailsのActiveRec ...

フォロー

blog-page_side_responsive

2021年11月
日 月 火 水 木 金 土
 123456
78910111213
14151617181920
21222324252627
282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。