初めまして、新卒一年目で未経験からwebサービスを作っている小川と申します。
今回は私が実際に書いたパスワードを忘れた方へについてアウトプットしたいと思います。
#簡略化した手順
1.パスワードを忘れた方用のページを作成(メールアドレス入力欄を作成)
2.入力されたメールアドレスがデータベースに登録されているかをチェック
3.メールアドレスが登録されている場合 4へ、されていない場合エラー表示
4.ランダムな文字列をmd5(uniqid(rand(),true))を用い生成し、URLのパラメータとする
5.現在時刻をdate("Y-m-d H:i:s")を用い取得し、 4,5で取得したデータをデータベースに保存
6.ユーザーに 4で生成したurlを付与したメールを送信(mb_send_mail関数)
7.ユーザーがurlを押した際にパラメータを取得(このパラメータがデータベースにあるかどうかを認証)
8.データベースにパラメータがあった際は現在日時を取得
9.登録されている日時と 8の日時を比べ24時間を超えていなければパスワード再設定ページへ(24時間は今回の仕様) 24時間経過している場合はエラー
10.エラーになった際、またはパスワード再設定ページを表示した際に 4.5でデータベースに登録したデータをdelete
##1.パスワードを忘れた方用のページを作成(メールアドレス入力欄を作成)
実際のページ
こちらはHTMLで実装可能なので説明は省略します
##2.入力されたメールアドレスがデータベースに登録されているかをチェック
PDO手法を用いてデータベースからセレクトします
実際のコード
##3.メールアドレスが登録されている場合 4へ、されていない場合エラー表示
第三者にメールアドレスが登録してあるか特定されてしまうのを避けるためにエラーの際もメールアドレス送信完了ページを表示する
上記のように訂正させていただきました。
コメントありがとうございます。
##4.ランダムな文字列をmd5(uniqid(rand(),true))を用い生成し、URLのパラメータとする
md5(uniqid(rand(),true)) については下記のリンクを参考にさせていただきました!ありがとうございます。
[ランダムな文字列生成] http://ysklog.net/php/2103.html
ただしパスワードのハッシュ化にはpassword_hash関数を用いることが推奨されています
[PHPリファレンス]http://php.net/manual/ja/function.password-hash.php
$passResetToken = md5(uniqid(rand(),true));
'http://care4/fac/index.php?passReset=$passResetToken';
上記のようにランダムで生成した文字列をURLのパラメータとして渡す
##5.現在時刻をdate("Y-m-d H:i:s")を用い取得し、 4,5で取得したデータをデータベースに保存
こちらについては下記リンクを参考にさせていただきました!ありがとうございます。
[PHPで日付関数を使いこなす]https://qiita.com/shuntaro_tamura/items/b7908e6db527e1543837
##6. 4で生成したurlを付与したメールをユーザーに送信(mb_send_mail関数)
メール送信に使っている関数
##7.ユーザーがurlを押した際にパラメータを取得(このパラメータがデータベースにあるかどうかを認証)
$_GETを用いてパラメータ取得
その後データベースにアクセスし認証
##8.データベースにパラメータがあった際は現在日時を取得
7のコードの一つ目のelse文で取得
##9.登録されている日時と 8の日時を比べ24時間を超えていなければパスワード再設定ページへ(24時間は今回の仕様) 24時間経過している場合はエラー
7のコードの二つ目のif else文で実装
##10.エラーになった際、またはパスワード再設定ページを表示した際に 4.5でデータベースに登録したデータをdelete
以上、パスワードを忘れた方への実装でした
プログラムを学び始めて2か月ちょっとなため不備が多いと思いますがご了承くださいませ。
質問、感想等ご意見お待ちしております。