LaravelのJetStreamはインストール時は、URLさえ知っていれば、誰でもメール登録できるようになっています。そして、実際に存在しないメールアドレスでも登録できるようになっていますので、メール確認が取れなければ登録できないように変更してみたいと思います。
メール確認機能の実装
Userモデルの確認
JetStreamをインストールしたばかりのデフォルトのUserモデルは、下記の様になっています。
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Jetstream\HasTeams;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens;
use HasFactory;
use HasProfilePhoto;
use HasTeams;
use Notifiable;
use TwoFactorAuthenticatable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
'two_factor_recovery_codes',
'two_factor_secret',
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* The accessors to append to the model's array form.
*
* @var array<int, string>
*/
protected $appends = [
'profile_photo_url',
];
}
MustVerifyEmailの実装
14行目を下記のように、implements MustVerifyEmaiを追加します。
use Illuminate\Contracts\Auth\MustVerifyEmail; //無ければ追加
// ...
class User extends Authenticatable implements MustVerifyEmail
{
// 既存のコード
}
これで、ユーザーが新規にアカウントを登録する際に、メールアドレスの確認が必要になります。
メールサーバーの設定
実際にメールを送信するために、.env ファイルでメールサーバー(SMTPサーバーなど)の設定を行います。
デフォルトでは下記の様になっています。
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
Xserverでの設定例
それでは、実際にメール送信するための設定例をXserverを使ってご紹介します。
- Xserver>レンタルサーバー>サーバー管理>メールアカウント設定
- ドメイン名を選択して、laravel@my-domain.jpでメールを作成します。
- 作成したら、メールソフト設定をクリックします。
- 設定対象ドメインが作成したメールソフトのドメインであることを確認します。
- そこに記載されているSMTPサーバーをメモします。
- Laravelの.envを開き、下記の様に記載します。
MAIL_MAILER=smtp
MAIL_HOST=svXXXXX.xserver.jp #XserverのSMTPサーバー
MAIL_PORT=587 # または、セキュリティ要件に応じて465(SSLの場合)
MAIL_USERNAME=laravel@my-domain.jp #作成したメールアドレス
MAIL_PASSWORD=my_password #設定したパスワード
MAIL_ENCRYPTION=tls # SSLを使用する場合は、'ssl' に変更
MAIL_FROM_ADDRESS=laravel@my-domain.jp #作成したメールアドレス
MAIL_FROM_NAME="${APP_NAME}"
Route [verification.notice] not defined.エラー
何らかの原因で、上記のエラーが出る場合があります。その時の対処法を記載しておきます。
ルート確認
下記でverification.verifyルートの存在を確認をします。
php artisan route:list
php artisan route:list で verification.verify ルートがリストされていない場合、これはメール確認に関連するルートがアプリケーションに正しく登録されていないことを意味します。この問題を解決するためには、メール確認機能に必要なルートをアプリケーションに追加する必要があります。
Laravel Jetstreamを使用している場合、通常はメール確認ルートが自動的に設定されるはずですが、何らかの理由でこれが欠けている可能性があります。
メール確認ルートの手動追加
Laravel 8以降で、Auth::routes() が機能しない、または使用されていない場合、メール確認ルートを手動で追加することができます。
routes/web.php ファイルに以下のルートを追加します。
use Illuminate\Foundation\Auth\EmailVerificationRequest;
use Illuminate\Http\Request;
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
return redirect('/dashboard');
})->middleware(['auth', 'signed'])->name('verification.verify');
Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();
return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');
キャッシュの追加
変更を反映させるために、ルートキャッシュをクリアします。
php artisan route:clear
ルートの確認
再度 php artisan route:list を実行して、verification.verify ルートがリストされていることを確認します。
再度登録処理
それでは、再度登録処理をしてみましょう。
すぐにダッシュボードに移動しなければ、大丈夫だと思います。
メール認証
ユーザー登録したメールに認証用のメールが送られてきたら、それをクリックすれば認証完了です。
コメント