4

私はmongooseとexpressで実行されているnode.js RESTサービスを持っています。また、merse を使用してルーティングをセットアップしています。

私が今達成したいのは、次のタイプのシナリオです。

Scenario I: e.g. blogpost
- GET -> no authentication required
- POST/PUT/DELETE -> authentication required

Scenario II: e.g. user
- GET -> authentication required
- POST/PUT/DELETE -> authentication required plus username of logged in user has to match

私はすでにeveryauthとmongoose-authを見てきましたが、この種の制御を与えるものは何も見つかりませんでした.

4

1 に答える 1

15

everyauth のことは忘れてください。このライブラリはやり過ぎです。認証の実装は実際には非常に簡単です。スキーマに従ってください。

  1. ユーザーはサーバーにusername渡します。password
  2. サーバーは、そのユーザーが存在するかどうかを DB で取得usernameおよびチェックします。ユーザーがいない場合は、エラーで応答します。passwordpassword
  3. ユーザーがいて、Express のビルトイン セッション メカニズムを使用するようになりました。を呼び出しreq.session.regenerate、コールバックで do を実行しますreq.session.userID = user.id。Express は自動的に Cookie をユーザーに送信します。
  4. 基本的データベースでreq.session.userID. 見つかった場合は、 に保存しreqますreq.user = user
  5. ビューでは、req.user変数が設定されているかどうかを確認するだけです。そうであれば、私たちは認証されています。そして、あなたは完了です!

広告 1+2) 認証を安全にするために、何らかの暗号 (および/または HTTPS) を使用する必要があります。たとえば、パスワードは と の 2 つの部分で DB に保持する必要がありsaltますhashsaltは (登録時に) ランダムに生成され、hash = hash_it(pwd, salt)hash_itハッシュ アルゴリズム (例: MD5 または SHA256) です。

クライアント側の認証は、いくつかの手順で行うことができます (JavaScript を使用できる場合のみ)。

  1. サーバーはログイン ページにランダムnew_saltに送信します (または JavaScript で生成します。生成アルゴリズムを非表示にする必要はありません)。
  2. ユーザーは AJAX リクエストgive me salt for user Xを送信し、サーバーはsaltDB に格納された (salt公開されている) で応答します。
  3. で応答ハッシュpwdsalt、結果を で再度ハッシュしnew_saltて、変数に格納しますhpwd
  4. クライアントusernameは 、hpwdおよびnew_saltをサーバーに送信します。
  5. サーバーはpwdDB から を取得しusername、ハッシュpwdnew_saltて結果を比較しhpwdます (注: は保存しませんnew_salt)。

usernameとが同じであっても、(外部の観点から)ランダムにログインするたびにデータがネットを流れるため、この方法は便利ですpassword

passwordリークは深刻な問題であるため、これは重要です。誰かがあなたのアプリのアカウントを破ることができるからではありません (あなたが銀行でない限り、それは小さな損害ですが、そのような質問をすることはありません :D )。その主な理由は、人々が銀行口座を含む複数のサイトで同じパスワードを使用する傾向があるためです。

于 2012-06-25T10:28:29.667 に答える