すべて、
私は小さな、非営利のWebアプリを開発しています。パスワードを紛失した可能性のあるユーザーを支援する方法を決定しようとしています。優先順位の高いメカニズムが必要です。
1)ユーザーフレンドリー。
2)安全。
3)複数の地域で簡単にスケーラブルです(つまり、場所に依存しないため、たとえばSMSはありません)。
別のアプローチ:
登録時に使用したメールアドレスをユーザーに提供してもらいます
メールアドレスが実際にアカウントに属していることを確認します(含まれていない場合はエラーを報告します)
でそのメールアドレスにメールを送信...
...自動生成された新しいパスワード(辞書に載っている単語はランダムな文字よりも優れています)で、一定期間(24時間としましょう)後に失効します
...この新しいパスワードはあなたのウェブサイトからのリクエストとして送信され、彼らがそのメールを無視するようリクエストしなかった場合のメッセージ
...新しいパスワードで再ログインするために訪問する必要があるURL(このページが実際のパスワードではなく一時的なパスワードに対して検証されることを確認してください)
最初のログイン後、パスワードを覚えているページに更新する必要があるページに移動します(ハッシュしたため、実際のパスワードを表示することはできませんか?)
私の標準的な操作手順:
まず、ユーザーに電子メールアドレスまたはログイン名の入力を求めます。情報が見つからない場合、アドレスが偽であることをユーザーに伝えるのはNiceですが、これはこの情報をブルートフォースするのにも役立ちます。ログインとメールアドレスが同一ではないシステムでは、同じページでこれらのeitherを要求する方が、異なるページに分けるよりもユーザーフレンドリーになります。
次に、一意のトークンを生成し、アカウントに関連付けます。このトークンをURLに統合するリンクを含むメールをユーザーのメールアドレスに送信し、ワンクリックでアカウントを取得できるようにします。
第三に、トークンのあるURLにアクセスすると、ユーザーに新しいパスワードの入力を求めます。フォーム送信にもトークンが含まれていることを確認してください。ユーザーのパスワードを新しい目的の値に変更し、トークンを無効にします。
私が見たバリエーションでは、メールにsecondトークンを追加します。このトークンは、結果のパスワードリセットページで入力する必要があります。
また、妥当な期間(たとえば48時間)後にトークンを無効にする必要があります。
ここでは、パスワードのリマインダーやセキュリティの質問がないことに注意してください。ユーザーの電子メールアカウントが侵害された場合、悪意のあるユーザーがアカウントをハイジャックできるようになります。これは解決する問題ではありませんです。 couldある種のセキュリティの質問を追加しますが、その前に、これらのいずれかに最後に直面したことを考え、それらがどれだけ苦痛であるかを思い出してください。
システムがユーザーが複数の場所からログインすることを許可している場合(それがいい!)、これを許可するために使用するトークンがユーザーの電子メールアドレスとパスワードの両方に関連付けられていることを確認することができます。これらのいずれかが変更されると、他のすべての場所からユーザーがログアウトされます。