広告

Laravel 5.8 でメール認証付きユーザ認証

Laravelでは認証機能(Auth)が標準で実装されているので簡単にWEBシステムに必要なユーザ認証ができます。
通常のユーザ認証は
①ユーザ登録で仮登録
②メールアドレスにメールが届き、リンクをクリックすることで本登録
とすることでメールアドレスの確認も行いますが、Laravel標準の認証機能では①の仮登録で本登録となります。
もちろんAuthには②まで行う通常の本登録のシステムも用意されていますので実装しましょう。

とかやってるうちにLaravel 6.0 では make:auth コマンドもフレームワークから分離され laravel/ui パッケージに移行されましたね。。。気になるところですがまたいずれ・・・

Laravel開発環境-Laradock

DockerでLaravel開発環境-Laradock

# Laradock起動
PS C:\laravel\laradock> docker-compose up -d workspace mysql nginx phpmyadmin
# BashでLaradockのworkspaceにログイン
PS C:\laravel\laradock> docker-compose exec workspace bash

Laravel標準の認証機能(Auth)

デフォルトでusersテーブルとpassword_resetsテーブルのマイグレーションファイルが生成されているので

# マイグレーション
root@7b33d48aadc4:/var/www# php artisan migrate
# 認証機能生成
root@7b33d48aadc4:/var/www# php artisan make:auth

http://localhost

laravel-auth_1

※ヘッダに「LOGIN」「REGISTER」メニューが出る。
トップ画面

laravel-auth_2

LOGIN画面

laravel-auth_3

REGISTER画面
※REGISTERで登録したらすぐにログインできちゃうので通常はメール認証が必要ね。

Authでメール認証

【MustVerifyEmailインターフェイス】

★app/User.phpにMustVerifyEmailインターフェイスを実装しましょう。

app/User.php

//class User extends Authenticatable
class User extends Authenticatable implements MustVerifyEmail

【Routesの設定】

routes/web.php

//Auth::routes();
Auth::routes(['verify' => true]);

# メール認証済のユーザだけに見せるページ
//Route::get('/home', 'HomeController@index')->name('home');
Route::get('/home', 'HomeController@index')->name('home')->middleware('verified');

# またはグループ化して
Route::middleware('verified')->group(function() {
    Route::get('/home', 'HomeController@index')->name('home');

});

※メール認証無しで http://localhost/home にアクセスするとログイン画面に遷移することを確認。

【ビューの日本語化】

★メールアドレス入力後の画面を日本語にしましょう。

<div class="card-header">メール認証</div>

<div class="card-body">
    @if (session('resent'))
        <div class="alert alert-success" role="alert">
          メール認証リンクがあなたのメールアドレス宛に送信されました。
        </div>
    @endif

    メール認証リンクをクリックして認証を願いします。
    メールが来ていない場合は<a href="{{ route('verification.resend') }}">こちら</a>をクリックすることで再送信されます。
</div>

【メールの日本語化】

# Notification作成
root@7b33d48aadc4:/var/www# php artisan make:notification VerifyEmailJapanese

★/vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php のメール内容を日本語に書き換えましょう。

namespace App\Notifications;	// namespace変更

class VerifyEmailJapanese extends Notification	// クラス名変更
{
・・・
    public function toMail($notifiable)
    {
        $verificationUrl = $this->verificationUrl($notifiable);

        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
        }
        // 日本語に書き換え
        return (new MailMessage)
            ->subject(Lang::getFromJson('本登録メール'))
            ->greeting(Lang::getFromJson('Project1です!'))
            ->line(Lang::getFromJson('以下の認証リンクをクリックして本登録を完了させてください。'))
            ->action(Lang::getFromJson('メールアドレスを認証する'), $verificationUrl)
            ->line(Lang::getFromJson('もしこのメールに覚えが無い場合は破棄してください。'));
    }
・・・
}

★app/User.phpでsendEmailVerificationNotificationアクションをオーバーライドしましょう。

app/User.phpに追記

// Override
public function sendEmailVerificationNotification()
{
    $this->notify(new \App\Notifications\VerifyEmailJapanese);
}

補足:メール送信エラー発生

laravel stream_socket_enable_crypto(): SSL operation failed with code 1.~

★config/mail.phpに下記を追記することで回避できました。

'stream' => [
   'ssl' => [
      'allow_self_signed' => true,
      'verify_peer' => false,
      'verify_peer_name' => false,
   ],
],

補足:モデルをapp/Modelsディレクトリ以下に配置したい

【ディレクトリ作成&app/User.php移動】

# app/Modelsディレクトリ作成
root@7b33d48aadc4:/var/www# mkdir app/Models
# app/User.phpファイル移動
root@7b33d48aadc4:/var/www# mv app/User.php app/Models/

【名前空間の修正】

namespace App;
↓
namespace App\Models;
use App\User;
↓
use App\Models\User;
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
↓
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
    'stripe' => [
        'model' => App\User::class,
↓
    'stripe' => [
        'model' => App\Models\User::class,
use App\User;
↓
use App\Models\User;

【モデル作成】

root@7b33d48aadc4:/var/www# php artisan make:model Models/Xxx

補足:ログインユーザ情報の取得

use Illuminate\Support\Facades\Auth;

$user = Auth::user();
$user->id;
$user->name;