流れ
・ログイン機能をつける
・パスワードを平文にする
・メール認証もつける
[参考]
導入
https://www.terakoya.work/laravel-make-auth-exec-flow/
パスワードを平文で保存
https://nobuhiroharada.com/2018/05/22/auth-login-plain-text/
メール認証
https://blog.capilano-fw.com/?p=1099
初期設定
config/app.php
'email' => env('APP_EMAIL', 'info@your.com'),
を追加。
また、URLやNAMEなども設定しておく。
そして、同じ値を .env にも記載。
その後
php artisan config:cache
でキャッシュをクリアずる。
ログイン機能をつけよう
php artisan make:auth
テーブルを作ろう
--
-- テーブルの構造 `users`
--
CREATE TABLE `users` (
`id` bigint(20) NOT NULL,
`email` text NOT NULL,
`email_verified_at` timestamp NULL DEFAULT NULL,
`name` text NOT NULL,
`password` varchar(60) NOT NULL,
`reminder_token` text DEFAULT NULL,
`remember_token` text DEFAULT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
--
-- Indexes for dumped tables
--
--
-- Indexes for table `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
COMMIT;
ついでにパスワードリセット用テーブルも作成
--
-- テーブルの構造 `password_resets`
--
CREATE TABLE `password_resets` (
`email` varchar(255) DEFAULT NULL,
`token` varchar(255) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
COMMIT;
以上で完了。
にアクセスしてログインページが表示されるか確認。
パスワードを平文にしよう
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => $data['password'],
]);
}
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return ($plain === $user->getAuthPassword());
}
注意
composer update などをすると コアファイルが変わってしまう。
よって以下のエラーが出るようになるので、updateしたら必ず確認し、変更すること。
These credentials do not match our records.
以上で暗号化無しの平文化完了。
メール認証及び日本語化
class User extends Authenticatable implements MustVerifyEmail
{
// 省略
}
Email Verificationを使うためにMustVerifyEmailと追加。
//Auth::routes();
Auth::routes(['verify' => true]);//変更
Route::middleware('verified')->group(function() {
// 本登録ユーザーだけ表示できるページ
Route::get('verified', function(){
return '本登録が完了してます!';
});
});
テスト登録
https://sample.test/register
で登録。
https://sample.test/verified
へアクセス
「メールアドレスの認証をお願いします。もしメールを受け取ってないなら、ここをクリックしてください」
という英文が表示されていますね。
では届いたメールをクリックしてみましょう。
https://sample.test/verified
すると web.php に設定した"本登録が完了しています"が表示されます。
日本語化
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">本登録</div>
<div class="card-body">
@if (session('resent'))
<div class="alert alert-success" role="alert">
新しい本登録メッセージが送信されました。
</div>
@endif
メールアドレスの認証をお願いします。<br>
もしメールを受け取ってないなら、<a href="{{ route('verification.resend') }}">ここをクリックしてください</a>。
</div>
</div>
</div>
</div>
</div>
@endsection
本登録メールを日本語化する
php artisan make:notification VerifyEmailJapanese
<?php
namespace App\Notifications;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\Lang;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;
class VerifyEmailJapanese extends Notification
{
/**
* The callback that should be used to build the mail message.
*
* @var \Closure|null
*/
public static $toMailCallback;
/**
* Get the notification's channels.
*
* @param mixed $notifiable
* @return array|string
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Build the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
if (static::$toMailCallback) {
return call_user_func(static::$toMailCallback, $notifiable);
}
return (new MailMessage)
->subject(Lang::getFromJson('本登録メール'))
->line(Lang::getFromJson('以下の認証リンクをクリックして本登録を完了させてください。'))
->action(
Lang::getFromJson('メールアドレスを認証する'),
$this->verificationUrl($notifiable)
)
->line(Lang::getFromJson('もしこのメールに覚えが無い場合は破棄してください。'));
}
/**
* Get the verification URL for the given notifiable.
*
* @param mixed $notifiable
* @return string
*/
protected function verificationUrl($notifiable)
{
return URL::temporarySignedRoute(
'verification.verify', Carbon::now()->addMinutes(60), ['id' => $notifiable->getKey()]
);
}
/**
* Set a callback that should be used when building the notification mail message.
*
* @param \Closure $callback
* @return void
*/
public static function toMailUsing($callback)
{
static::$toMailCallback = $callback;
}
}
// Override
public function sendEmailVerificationNotification()
{
$this->notify(new \App\Notifications\VerifyEmailJapanese);
}
以上で完了!
web.php の挙動
//ログインしていないと表示させない
Route::middleware('auth')->group(function() {
Route::match(['get', 'post'] , '/nikki/loginnomi/', 'NikkiController@loginnomi');
});
//ログインしている 且つ、 メール認証していないと表示させない
Route::middleware('verified')->group(function() {
Route::match(['get', 'post'] , '/nikki/ninsyou/', 'NikkiController@ninsyou');
Route::get('verified', function(){
return '本登録が完了してます!';
});
});
ログアウトへ飛ぶとエラーになる
web.phpに追加
Route::match(['get', 'post'] , '/logout/', 'Auth\LoginController@logout');
validateのパスワード数を変更したい
/RegisterController.php の 50行目らへんを変更
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:4|confirmed',
]);
}
また、パスワードのリセット時のバリデートも変更する必要があるので、
https://qiita.com/ma7ma7pipipi/items/479ecc4a49ea7fd059ba
を参考にする。