14

MEAN スタック (MongoDB、Express、AngularJS、および node.js) で Web アプリを開発しています。私はログイン システムを開発しており、Angular ルートの一部を保護して、ログイン ユーザーのみがアクセスできるようにします。このアーキテクチャにアプローチする最善の方法を考えようとしています。

私は現在のワークフローを考えています:

  • ユーザーは AngularJS フォーム経由でログインし、http POST を Express エンドポイントに送信します。エンドポイントはデータベースに対してユーザーを検証し、OAuth トークンと Cookie で応答します。どちらも、後で検証するために mongo データベースに保存されます。
  • AngularJS がログイン レスポンスを受信すると、受信した Cookie を ng-cookies を使用して保存し、OAuth トークンをユーザー サービスに保存します。
  • 現在、AngularJS でルートが変更されるたびに、ユーザー サービスを使用して、mongo データベース内の Cookie と比較することにより、Cookie がまだ正当であることを確認します (これは、Angular のリゾルブを使用した API 呼び出しになります...遅れ?)
  • ユーザーが「ログアウト」をクリックするか、Cookie の有効期限が切れると、Cookie と OAuth トークンの両方がデータベースから削除され、無効になります。

このアプローチは理にかなっていますか?安全で、比較的効率的/迅速に実行できますか?

4

1 に答える 1

8

元のワークフローと Express の認証の例を組み合わせることになりました。こちらを参照してください。それは次のとおりです。

  • ユーザーが最初にアプリをロードすると、ユーザーのセッションが既に存在するかどうかを確認する Express エンドポイントに対して HTTP 呼び出しが行われます。その場合、ユーザーは保存され$rootScope、ログインしていると見なされます。
  • AngularJS ルートが変更されるたびに、同じエンドポイントがアクセスされます。ルート保護は、ここで説明したのと同様の方法で指定されました。エンドポイントがセッションが存在しないことを返した場合は、$rootScope.user設定が解除され (必要な場合)、ユーザーはログイン ページにリダイレクトされます。
  • ログイン フォームが処理されると、Express エンドポイントに送信されます。エンドポイントは、mongoDB (存在する場合) からユーザーを取得し、パスワードのハッシュを試みます。一致する場合、ユーザーのセッションが設定され、mongo DB に保存され、エンドポイントはuserオブジェクトを返します (前述のように $rootScope に保存するために使用されます)。
  • 追加のエンドポイントにアクセスするたびに、関数は最初に関数を通過しrestrictます。これにより、データがクライアントに送信される前にセッションが存在することが保証されます。401セッションが存在しない場合はを返し、この HTTP インターセプターを使用して Angular 側で処理され、設定が解除$rootScope.userされ、ログイン画面にリダイレクトされます。
  • ユーザーがAngular側で「ログアウト」をクリックすると、セッションが設定解除されてmongo DBから削除され、$rootScope.usernullに設定され、ユーザーはフロントページにリダイレクトされます。
于 2013-10-06T18:52:49.323 に答える