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));
}