Posted at

「PHP」「laravel」認証のメールを作りましょう

More than 1 year has passed since last update.

ユーザーが登録してから、認証メールをもらいます。その認証メールの中でリンクがあり、リンクを押したら、ユーザーがベリバイドになります。そするとローギンできます。つまりベリバイドしてない限り、ローギンできないということです。ここでやり方をちょっと説明します。

1。まずはユーザーテーブルで「verified」と「email_token」のカラムを作りましょう。

    $table->tinyInteger('verified')->default(0);

$table->string('email_token')->nullable();

最初「verified」のカラムに0をあげて、ユーザーがベリバイドしてから1になります。「email_token」のカラムに秘密キーを保存します。そしてUser.phpを修正しましょう。「fillable」の変数に「verified」と「email_token」を追加しましょう。『もしいちいち追加するのが面倒だと思うなら、fillableの変数を消して、$guarded=[] に変更してもいいです。それを使うなら利点があるけれど、不利点もあるので気をつけないといけません』。そして「php artisan migrate」とか「php artisan migrate:refresh」を実行するのを忘れないでください。

2。そして「php artisan make:auth」を実行しましょう。もっと詳しく知りたければ、「https://laravel.com/docs/5.5/authentication」

で読めます。次はAuth/LoginControllerのクラスに修正しましょう。

もしユーザーがベリバイドしてない限り、ローギンできないということにしましょう。

protected function credentials(Request $request) {

return array_merge($request->only($this->username(), 'password'), ['verified' => 1]);
}

3。今「.env」のファイルを修正しましょう。メールのところに修正しましょう。ここでgmailやmailtrapなどを使えます。例:

これはgmailを使うなら、こいうふうになります。

MAIL_DRIVER=smtp

MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_FROM_ADDRESS=myemail@gmail.com(ここで好きな名前を使ってください)
MAIL_FROM_NAME=ハルだよ(ここで好きな名前を使ってください)
MAIL_USERNAME=メールのユーザーネーム
MAIL_PASSWORD=メールのパスワード
MAIL_PRETEND=false
MAIL_ENCRYPTION=tls

でも開発の時、mailtrapを使った方がいいと思います。mailtrapは使いやすいし、便利だし、無料ですから。https://mailtrap.ioで新しアカウントを登録できます。そして「demo inbox」を押したら、smtp設定が出てきます。

MAIL_DRIVER=smtp

MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=メールのユーザーネーム
MAIL_PASSWORD=メールのパスワード
MAIL_FROM_ADDRESS=myweb@example.com(ここで好きな名前を使ってください)
MAIL_FROM_NAME=ハルだよ(ここで好きな名前を使ってください)
MAIL_PRETEND=false
MAIL_ENCRYPTION=tls

毎回「.env」を修正する時、「php artisan config:clear」を実行するのを忘れなしでください。

4。次はLaravelのメールのサービスをたてましょう。「php artisan make:mail EmailVerification --markdown=emails.verification」を実行しましょう。そすると「Mail」のフォルダーの中で「EmailVerification」のクラスを作成されます。resources/assets/views/emailの中で「email」のクラスも作成されます

。これからこの二つのクラスを修正しましょう。最初「EmailVerification」のクラスでこの変数を追加しましょう。

    Protected $user;

そして「construct」のクラスの中で これを追加しましょう。

    $this->user = $user;

「build」のクラス で修正しましょう。

    return $this->markdown('emails.verification')->with([

‘email_token’ => $this->user->email_token,
]);

これで秘密キーが認証メールにつけっています。

次は「verification.blade.php」を修正しましょう。好きなでサインによって修正しましょう。でもこのurlを忘れないでください。そのurlは秘密キーを持っていますから。うちの場合 php artisan serveを使うので、「127.0.0.1:8000」に修正しました。

@component('mail::button', ['url' => 'http://127.0.0.1:8000/verifyemail/$email_token'])

Verify
@endcomponent

5。これからメールを送るクラスを作成しましょう。そのクラスをphp artisan jobで作成しましょう

。ここで「php artisan make:job SendVerificationEmail」を実行しましょう。そすると「Job」のフォルダーが出てきて、その中で「SendVerificationEmail」があります。そのクラスを修正しましょう。

use Mail;

use App\Mail\EmailVerification;
public function __construct($user)
{
$this->user = $user;
}
public function handle()
{
$email = new EmailVerification($this->user);
Mail::to($this->user->email)->send($email);
}

これでメールをユーザーに送られます。

6。今度はAuth/RegisterControllerのクラスを修正しましょう。上でこれを追加しましょう。

use Illuminate\Auth\Events\Registered;

use Illuminate\Http\Request;
use App\Jobs\SendVerificationEmail;

そしてCreateのクラスのreturnのところにこれを追加しましょう。

'email_token' => str_random(10)

安全のために、str_randomを使うと思います。そして本来のRegisterのパスは登録してから、認証メールを使わずにローギンできるので、そのパスを修正しましょう。これを追加しましょう。

  public function register(Request $request)

{
$this->validator($request->all())->validate();
event(new Registered($user = $this->create($request->all())));
dispatch(new SendVerificationEmail($user));
return view('/verification');
}

public function verify($token)
{
$user = User::where('email_token',$token)->first();
$user->verified = 1;
if($user->save()){
return view('/emailconfirm',['user'=>$user]);
}
}

ここでパスを変更するために「dispatch(new SendVerificationEmail($user)); return view('/verification’);」を使います。登録してから、ユーザーは「verification.blade.php」に飛ばされます。そして、もし認証メールの中でリンクを押したら、「verify」クラスが実行されて、「verified」のカラムが1に設定して、ユーザーは「emailconfirm.blade.php」に飛ばされます。次は「verification.blade.php」を作成しましょう。例:


verification.blade.php

@extends(layouts.app)

@section(content)
<div class=container>
<div class=row>
<div class=col-md-8 col-md-offset-2">
<div class=”panel panel-default”>
<div class=”panel-heading”>Registration</div>
<div class=”panel-body”>
You have successfully registered. An email is sent to you for verification.
</div>
</div>
</div>
</div>
</div>
@endsection


今度は「emailconfirm.blade.php」を作成しましょう。


emailconfirm.blade.php

@extends(layouts.app)

@section(content)
<div class=container>
<div class=row>
<div class=col-md-8 col-md-offset-2">
<div class=”panel panel-default”>
<div class=”panel-heading”>Registration Confirmed</div>
<div class=”panel-body”>
Your Email is successfully verified. Click here to <a href=”
{{url(‘/login’)}}”>login</a>
</div>
</div>
</div>
</div>
</div>
@endsection

7。最後はRoute/web.phpにこれを追加しましょう。

Route::get(‘/verifyemail/{token}’,‘Auth\RegisterController@verify’);

何卒よろしくお願いいたします。