ソースコードを順に見て行ったところ、laravelでは期限付き署名URLを用いてメールアドレスの確認を行なっていることがわかりました
署名には、送信USL・有効期限・環境変数を用いているようです
署名URL生成は以下のコードのreturnの部分
$this->keyResolverの部分で環境変数が使われているそうです
php
1// Illuminate\Routing\UrlGenerator.php
2public function signedRoute($name, $parameters = [], $expiration = null, $absolute = true)
3 {
4 $parameters = $this->formatParameters($parameters);
5
6 if (array_key_exists('signature', $parameters)) {
7 throw new InvalidArgumentException(
8 '"Signature" is a reserved parameter when generating signed routes. Please rename your route parameter.'
9 );
10 }
11
12 if ($expiration) {
13 $parameters = $parameters + ['expires' => $this->availableAt($expiration)];
14 }
15
16 ksort($parameters);
17
18 $key = call_user_func($this->keyResolver);
19
20 return $this->route($name, $parameters + [
21 'signature' => hash_hmac('sha256', $this->route($name, $parameters, $absolute), $key),
22 ], $absolute);
23 }
24
検証部分は以下のコード
URLのsignature以外の部分のハッシュ関数の値が、signatureの部分と一致していることと、期限が有効であるかを検証しています
php
1// Illuminate\Routing\UrlGenerator.php
2 public function hasValidSignature(Request $request, $absolute = true)
3 {
4 return $this->hasCorrectSignature($request, $absolute)
5 && $this->signatureHasNotExpired($request);
6 }
7
8 public function hasCorrectSignature(Request $request, $absolute = true)
9 {
10 $url = $absolute ? $request->url() : '/'.$request->path();
11
12 $original = rtrim($url.'?'.Arr::query(
13 Arr::except($request->query(), 'signature')
14 ), '?');
15
16 $signature = hash_hmac('sha256', $original, call_user_func($this->keyResolver));
17
18 return hash_equals($signature, (string) $request->query('signature', ''));
19 }
20
21 public function signatureHasNotExpired(Request $request)
22 {
23 $expires = $request->query('expires');
24
25 return ! ($expires && Carbon::now()->getTimestamp() > $expires);
26 }
参考文献
GitHub laravel/frameword
Laravelの実装調査