×

パスワードリマインダー実装の流れとポイントまとめ

2016年7月10日 WEB

パスワードをお忘れですか

メールアドレスとパスワードを登録するだけで、サイトへログインしてサービスを利用可能になるという会員登録制のウェブサイトが多くあります。

しかし、会員登録したはいいけど自分のパスワードが分からないという経験がある方も多いのでは?

非常に多くの会員登録系Webサイトのログイン画面ページには、パスワードを忘れた人への救済措置として、にパスワードリマインダー機能を設けています。

最近、パスワードリマインダー機能をプログラミングで実装する機会があったので、パスワードリマインダー機能実装の流れとポイントをまとめてみました

初めてパスワードリマインダーを実装するという方は参考までにどうぞ。

パスワードリマインダー機能とは

パスワードリマインダー機能は「秘密の質問」などといったユーザ本人のみがわかる情報を入力することで、パスワード変更を可能にするという機能です。
(※人によってはパスワードリセットという呼び方をしていたり、機能の内容が細かい部分で異なることもありますが、ここではパスワードリマインダーと呼ぶことにします。)

パスワードリマインダー実装時のポイント

パスワードリマインダー実装で重要になるのはパスワードの秘匿性を高めることです。
できるだけパスワードを第三者に見られないようにしなければいけません。

パスワードをメールに直接記載することは絶対にNG

絶対にやってはいけないことは、登録メールアドレスに対して、生パスワードもしくは仮パスワードを記載したメールを送信してしまうことです。
パスワードが記載されたメールが第三者に盗聴・盗み見されてしまうとアカウントを乗っ取られます。

パスワード変更用のワンタイムURLと認証コードの二重照合

メールに直接パスワードは記載することは絶対にNGであるため、パスワード変更用URL(ワンタイムURL)を発行し、ユーザーがURLにアクセスして新しいパスワードを再設定する方式をとることにします。

ただ、パスワード変更用URLにアクセスして無条件にパスワード変更を許可してしまうと、メールの中身を第三者が見て先にパスワードを変更されてアカウントを乗っ取られる可能性があります。

パスワード変更用URLに加えて、認証コード(メールアドレスを入力した直後にだけ表示させる)を発行し、パスワード再設定時に新パスワードと共に認証コードを入力することでパスワード再設定を可能にします。

また、SSLを使うことでさらに秘匿性を高めることができます。

SSL暗号化運営サイトの安全性を高める!『SSL』とは?~導入手順と選び方~
先日金融系のお客さんのWEBサイト制作を進めている際、「SSLを導入して欲しい」という要望がありました。なんでもPマークの申請をおこな...

【参考】
パスワードリマインダーの実装を考える – Scrapcode@はてなダイアリー

パスワードリマインダー実装の流れ

先述した通り、二重照合によりパスワードリマインダー(パスワード再設定機能)実装することにします。

使用する言語として、Webプログラミング初心者にも優しい言語PHPで実装する場合を考えます。

メールアドレス送信フォームを設置する

メールアドレス送信フォームを設置するためのページを用意して、メールアドレス送信フォーム(メールアドレス入力欄と送信ボタン)を設置します。

メールアドレスを照合して、ワンタイムURLと認証コードを発行

メールアドレスを入力して、送信ボタンがクリックされたら、入力されたメールアドレスが登録されているかどうか、データベース内のユーザー情報管理テーブルで照合します。
(JavaScriptと正規表現を使って、ちゃんとメールアドレスの形式で入力されているかチェックしておくとなお良し。)

コンタクトフォームJavaScript(jQuery)と正規表現で問い合わせフォームの入力チェックとエラーメッセージ表示を行う方法
問い合わせフォーム設置するにあたり、各項目が正しく入力されているかどうかチェックして、入力に誤りがあった場合はエラーメッセ...

【ユーザー情報管理テーブル内に存在していない場合】
「このメールアドレスは登録されていません」といったエラー文を画面に表示させる。

【ユーザー情報管理テーブル内に存在している場合】
ワンタイムURL作成用のランダムな英数字(30桁くらいあれば十分かと思います)と、認証コード(数字6桁くらい)を発行して、ユーザー情報管理テーブル中の該当するメールアドレス情報のレコードに保存する。

さらに、ワンタイムパスワードに有効期限を設定したい時、例えば有効期限をパスワード変更申請時から24時間にしたい場合、ワンタイムURLの英数字と認証コードの発行した日時に1日足してレコードに保存しておきます。

該当のメールアドレスにランダムな英数字を使ったワンタイムURLを掲載したメールを送信して、ブラウザの画面には「パスワード変更用URLを掲載したメールを送信しました」といったメッセージと、認証コードを表示します。

パスワード変更フォームを設置する

次は、ワンタイムURL(パスワード変更用URL)のページを作成します。

ワンタイムパスワードにアクセスされたときに、ワンタイムURLに使用されているランダムな文字列をユーザー情報管理テーブルで検索して、一致してかつアクセスされた日時とレコードに保存された日時を比較した時に「アクセス日時 > レコードの日時」であれば、「有効期限が切れています」というメッセージを画面に表示します。

ページを作成したら、パスワード変更フォームを設置します。入力項目としては、パスワード、パスワード(確認用)、認証コードの3つを用意します。

パスワード変更フォームへの入力内容をチェックして、パスワードを変更する

【入力チェックで引っかかる場合】
2回入力したパスワードが一致するかどうかチェックして、一致しなかったら「パスワードが正しくありません」というエラー文を画面に表示します。

入力された認証コードと、ワンタイムパスワードで使用されている文字列をキーに、ユーザー情報管理テーブルを検索します。

データベースの認証コードが間違っていたら「認証コードが間違っています」エラー文を画面に表示します。

【入力チェックがOKだった場合】
パスワード、認証コードが正しく入力されていれば、データベースのユーザー情報管理テーブルのパスワードを新しいパスワードに上書きします。そして、ワンタイムURL作成用のランダムな英数字と、認証コード、有効期限を破棄します。

最後に「パスワードの変更が完了しました」というメッセージを表示して、ログイン画面へのリンクを置くなどしてログインを促します(もしくはパスワード変更のタイミングでログイン状態にする)。

まとめ

いかがでしたか?

今回のパスワードリマインダーの実装の流れは、結構大まかで抽象的な内容だとは思いますが、なんとなく考え方をつかんでもらえれば幸いです。

関連記事