あー、びおら弾きたい...笑
今日は激烈に体調が悪く、起きてからずっと胃痛に悩まされてたので実は全然作業できてないです・・・・・・。
その遅れを取り戻すため、夜7時から活動開始しましたが、うーん・・・・・・。
まぁ、一応予定では金曜までに機能を完成させれば目的は果たせるんですけど、うーん。今日の進度が良さそうなら明日から筋トレ再開しようかなって思ってるんですけどね。
とか言いながらこんなもの食べてるのは頭おかしいとしか言えませんね。胃痛で苦しんだ後にデカ盛りラーメンはさすがに自殺行為としか思えまえんね!
さすが自殺願望持ちは考え方が違う!
まぁ別に僕が苦しんでても誰も悲しみませんしね。俺がいま幸せならそれでいいのだ。(笑)
という冗談はさておき、体調が悪い時はとりあえずカロリー取って気分だけでも爽やかになった方がいいんじゃないかって感じはするんですよ!そう、これは滋養強壮を狙ったものなのである(・∀・)
・・・・・・さて、今日は昨日やったメールアドレス認証のまとめでも。
とりあえずメールアドレス認証のライブラリを使いたいなぁーって思ってたんですけど、軽く探してみたんですけど、ないんですよねこれが...
ということで、今回も自分でぽちぽち書こうかなぁと思うのです。
ただ、今回は一から書くんじゃなくて、Anonymousとか作った時の資産を使えばいいかな、って感じはします。
言うて仕組みはそんなに難しくないので、わざわざライブラリにするよーなものでもないのかなぁみたいな感じです。
一応、軽く実装の仕組みを喋りますと、なんかテキトーな文字列のトークンを生成してそれをユーザーテーブルにぶち込んで、そのトークンをくっつけたURLをメール送信し、それをクリックしてもらうことで確認ができる、ってわけですね。
トークンはメール受信者以外知り得ない情報なので、これで認証ができます。ついでに生成日時なんかをテーブルに突っ込んでおけば時間制限とかできますね。
将来的には時間制限をつけるかも知れませんが、今回は時間制限をつけないこととします。
過去の資産を流用しようと思ったんですが、どうやらLaravel5.4になってちょっと仕様が変わったっぽいので、それに合わせて書き換える感じになりそーですね。
とりあえず簡単に実装してみました。
データベースに「確認するEmailの対象」みたいなカラムは別に入れなくてもいいんですけど、メンテナンス性のためにとりあえず入れておくことにします。
まず、メールの環境設定ですね。今回はgmail使います。さすがに本番で使うつもりないですけど笑
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=ID@gmail.com
MAIL_PASSWORD=パスワード
MAIL_ENCRYPTION=tls
調べてるといろんなサービスが使えるみたいですが、プロトタイプの時点では普通にsmtpで通します。
ただ、将来的には別のものを使う可能性がありそうですね。レスポンス悪いし...
//emailを渡すと、ハッシュ付きのメールを送信する
private static function send_email_token($email){
$token=str_random(60);
DB::table('users')
->where('id', Auth::user()->id)
->update([
'email_confirm' => 0, //メール認証を”未完了”にする
'confirmation_email' => $email,
'confirmation_token' => $token,
'confirmation_created_at' => new \DateTime()
]);
Mail::to($email)
->queue(new MailCertification($token));
}
で、こちらがメール送信部の実態ですね。色々ゴミデータが入ってますがまぁ気にしない方向で。
なんとなく汎用性を目指して静的関数で宣言してます。実際メールアドレスさえあればいいわけですしね。とりあえず認証系なので認証系のコントローラーにぶち込んでやりましたが、別にクラス作ってもよかったかも知れませんね。
やってることは簡単です。ランダムに60文字生成させて、それをDBに登録して、メール送信してもらってるだけです。
いつのまにかメール送信がより書きやすくなってます。5.3からみたいですね。toに宛先を入れて、あとはメール送信用のクラスを作ってくれって感じです。たいへん管理がしやすいです。よき。
class MailCertification extends Mailable
{
use Queueable, SerializesModels;
protected $token;//トークン
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($token)
{
$this->token = $token;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->from('example@example.com')
->view('Emails.MailCertification')
->subject('【Livvon】メールアドレス認証')
->with([
'token' => $this->token
]);
}
}
で、これが実態ですね。
|
$ php artisan make:mail MailCertification
|
たぶんこれでベースが勝手に生成されます。基本的にbuild()をいじりますが、今回はトークンが絶対に渡されるので、コンストラクタでそれを登録しています。
あとはビューに普通に渡せばいいだけです。おおらくちん。
メールアドレス認証を行います。<br>
以下のURLをクリックして変更を確定してください。<br>
<br>
{{ url('cert/'.$token) }}
<br>
<br>
※心当たりがない場合は無視して下さい。ご迷惑をおかけしました。
ビューはこんな感じです。そのまんまですね。
実際の画面だとこんな感じです。ほんとにすぐできちゃいましたね。
public function check_token($token){
$record = DB::table('users')->where('confirmation_token', $token);
$userinstance = $record->first();
if(empty( $userinstance )){
//トークンが異なっている
return view("Error.mailcert");
}
//トークンが一致、情報を更新する
$record->update([
'email_confirm' => 1, //メール認証を”完了”にする
'email' => $userinstance->confirmation_email,
'confirmation_email' => null,
'confirmation_token' => null,
'confirmation_created_at' => null,
]);
return view('auth.mailcertfinish');
}
せっかくなので、認証実行部分も。かなーーり簡単に作ってますけどこれで充分だと思います。
トークンで検索して、ヒットしたらそれを認証すればいいです。ヒットしなかったらなんかおかしいのでエラー画面に飛ばす。
トークンでの検索は、トークンにインデックスつけないと激マズなので、場合によってはパラメーターにemailあるいはidをつけるとかのチューンナップをしてもいいかも知れませんね。僕はめんどかったのでやめました(笑)
とりあえずメールアドレス認証はこんな感じで作れます。メール送信もすごい管理しやすくなった感じしますね。
ハンドシェイクなどでメールは大活躍するので、これだけ使いやすいと作りがいもありそーですね(笑)(笑)
んじゃ、がんばってノルマ達成に向けてプログラミングしますぞ(・∀・)