everyauth のことは忘れてください。このライブラリはやり過ぎです。認証の実装は実際には非常に簡単です。スキーマに従ってください。
- ユーザーはサーバーに
username渡します。password
- サーバーは、そのユーザーが存在するかどうかを DB で取得
usernameおよびチェックします。ユーザーがいない場合は、エラーで応答します。passwordpassword
- ユーザーがいて、Express のビルトイン セッション メカニズムを使用するようになりました。を呼び出し
req.session.regenerate、コールバックで do を実行しますreq.session.userID = user.id。Express は自動的に Cookie をユーザーに送信します。
- 基本的にデータベースで
req.session.userID. 見つかった場合は、 に保存しreqますreq.user = user。
- ビューでは、
req.user変数が設定されているかどうかを確認するだけです。そうであれば、私たちは認証されています。そして、あなたは完了です!
広告 1+2) 認証を安全にするために、何らかの暗号 (および/または HTTPS) を使用する必要があります。たとえば、パスワードは と の 2 つの部分で DB に保持する必要がありsaltますhash。saltは (登録時に) ランダムに生成され、hash = hash_it(pwd, salt)はhash_itハッシュ アルゴリズム (例: MD5 または SHA256) です。
クライアント側の認証は、いくつかの手順で行うことができます (JavaScript を使用できる場合のみ)。
- サーバーはログイン ページにランダム
new_saltに送信します (または JavaScript で生成します。生成アルゴリズムを非表示にする必要はありません)。
- ユーザーは AJAX リクエスト
give me salt for user Xを送信し、サーバーはsaltDB に格納された (salt公開されている) で応答します。
- で応答ハッシュ
pwdしsalt、結果を で再度ハッシュしnew_saltて、変数に格納しますhpwd。
- クライアント
usernameは 、hpwdおよびnew_saltをサーバーに送信します。
- サーバーは
pwdDB から を取得しusername、ハッシュpwdしnew_saltて結果を比較しhpwdます (注: は保存しませんnew_salt)。
usernameとが同じであっても、(外部の観点から)ランダムにログインするたびにデータがネットを流れるため、この方法は便利ですpassword。
passwordリークは深刻な問題であるため、これは重要です。誰かがあなたのアプリのアカウントを破ることができるからではありません (あなたが銀行でない限り、それは小さな損害ですが、そのような質問をすることはありません :D )。その主な理由は、人々が銀行口座を含む複数のサイトで同じパスワードを使用する傾向があるためです。