laravel9 標準のメール認証をカスタマイズして違うブラウザでも認証する。

未分類


今回laravel9の標準の認証機能を使って、同じブラウザなら認証がうまくいったのですが、携帯等で違うブラウザで開いた時に認証できない件があったので、認証状態でなくても、メールのverifyを入れる方法を考えたいと思います。

ポイントは3つ

ルーティングで認証済みになっている個所を外す

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {

})->middleware(['auth:api', 'signed'])->name('verification.verify');

上記の
->middleware([‘auth:api’, ‘signed’])
を消す

チェックを外す

下記でログイン済みのIDとメールアドレスのチェックをするので、ログイン済みでないのでコメントアウトします。

class EmailVerificationRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // IDが一緒かを確認している。
        // if (!hash_equals(
        //     (string) $this->route('id'),
        //     (string) $this->user()->getKey()
        // )) {
        //     return false;
        // }

        // メールアドレスが一致確認
        // if (!hash_equals(
        //     (string) $this->route('hash'),
        //     sha1($this->user()->getEmailForVerification())
        // )) {
        //     return false;
        // }

        return true;
    }

fullfillをオーバーライドする

App\VendeorOverridesフォルダを作成します。
そこにEmailVerrificationRequest.phpをコピーします。
authorizeをはずします。
認証データと照合してるので不要です。

    public function authorize()
    {
        // IDが一緒かを確認している。
        // if (!hash_equals(
        //     (string) $this->route('id'),
        //     (string) $this->user()->getKey()
        // )) {
        //     return false;
        // }

        // メールアドレスが一致確認
        // if (!hash_equals(
        //     (string) $this->route('hash'),
        //     sha1($this->user()->getEmailForVerification())
        // )) {
        //     return false;
        // }

        return true;
    }

次にfullfillで認証周りを少しかいて、veifyAtに値を入るようにすれば完了です。

    public function fulfill($request)
    {
        // 認証周りを書く。

        $user = User::find($request->route('id'));

        if ($user->markEmailAsVerified())
            event(new \Illuminate\Auth\Events\Verified($user));
    }