2017-12-19 10 views
0

メールとパスワードを入力する必要があるフォームで認証を実装したSailsJS Webサイトがあります。 ActivityOverloard 2.0 example codeどのようにアクセストークンを実装すれば、ログインページ(sailsjs)をバイパスできますか

ログインからコピー

login: function(req, res) { 
    console.log("Login hehe!!"); 
    // Try to look up user using the provided email address 
    User.findOne({ 
     email: req.param('email') 
    }, function foundUser(err, user) { 
     if (err) return res.negotiate(err); 
     if (!user) return res.notFound(); 

     console.log("found email"); 

     // Compare password attempt from the form params to the encrypted password 
     // from the database (`user.password`) 
     require('machinepack-passwords').checkPassword({ 
     passwordAttempt: req.param('password'), 
     encryptedPassword: user.encryptedPassword 
     }).exec({ 

     error: function(err) { 
      console.log("There was an error with password"); 
      return res.negotiate(err); 
     }, 

     // If the password from the form params doesn't checkout w/ the encrypted 
     // password from the database... 
     incorrect: function() { 
      console.log("Password doesn't checkout w/ the encrypted"); 
      return res.notFound(); 
     }, 

     success: function() { 
      console.log("Good password"); 
      var now = new Date(); 
      User.update(user.id, { online: true, lastLoggedIn: now }, function() { 
      // Store user id in the user session 
      req.session.me = user.id; 

      User.publishUpdate(user.id, { 
       online: true, 
       id: user.id, 
       name: user.name, 
       lastLoggedIn: now, 
       action: ' has logged in.' 
      }); 

      // All done- let the client know that everything worked. 
      return res.ok(); 
      }); 
     } 
     }); 
    }); 

私のページは今すぐログイン

myPage: function(req, res) { 
    if (!req.session.me) { 
     return res.view('login'); // not authenticated will take you to the login page 
    } 

    // It's authenticated, it runs the code below 
    // DO SOMETHING 

非常に特殊なユースケースで保護されて、私はそれをすることはできません(ユーザとの対話なしに私のページを開く必要があります私はまだそれを保護する必要があります。私はある種のアクセストークンを渡す必要があります。

「アクセストークン」をクエリのパラメータとして渡すことは、おそらく良い考えではないと私は理解していますか?実際に、私は私の問題を解決し、フォームを経由してユーザーとの対話を通じてセッションベースの認証以外のマイページにアクセスすることを可能にする方法がわからない

...

それは私がしたいと私には思われますプログラムでトークンを取得してから、ページを参照する必要があります。そこに問題を解決するためのベストプラクティスがあると思います。

任意のポインタ?誰かが知識のギャップを埋めることができるかもしれません。

+0

デフォルトを使用してみました 'session'メカニズムを帆。これは、セッションを格納するためにredisを使用します。 https://sailsjs.com/documentation/reference/configuration/sails-config-session – khushalbokadey

+0

あなたはどのように具体的になりますか? – zabumba

+1

シングルサインオンスタイルの操作を探していると思います。 SAML 2.0を搭載したパスポートでは、あなたのためのトリックが必要です。 – Glen

答えて

1

現実的に言えば、セールは両方の上に構築されるため、node.js/express.js、したがってsails.jsのパスワードなしまたは形式のないログインに関する複数のオプションがあります。

どのようにソリューションにアプローチするかは、アプリケーション/アプリケーションの規模と用途に大きく依存します。例えば;複数のアプリケーションまたは単一のWebアプリケーションにアクセスするために同じログイン資格情報が使用されるかどうかは、アプリケーションがイントラネットまたはWWW全体でのみ利用可能になるかどうかです。

上記のシナリオに関係なく、次にユーザーが必要とする初期設定があります。これは、アイデンティティプロバイダーへの最初のサインアップでも、アプリケーションへの最初のサインアップでもあります。サインアップフォームは、完全に消えず、むしろ1回のイベントになります。

いくつかのオプションと、それらをexpress/sailsアプリケーションに導入する方法を見てみましょう。私は最も基本的なものから始め、難しいところで作業します。

オプション1: sails session店舗を利用してください。あなたのコードから、あなたはすでにこれをやり始めています。ロジックは次のように動作します。

ユーザーが最初にサインアップまたはログインします。この段階では、認証するユーザーセッションを設定します。

// Store user id in the user session 
req.session.me = user.id; 
req.session.authenticated; 

認証を必要とするすべてのページにポリシーを設定します。幸いなことに、セイルはすでに、api/policiesフォルダにsessionAuthポリシーを作成することで、ここで重い作業をしています。設定/ policies.jsファイルを開き、それらを利用すると

'my_app' : { 
     'route_to_protect' : 'sessionAuth' 
}, 

最後に、あなたの保護されたページにこのポリシーを追加するには、このセッションクッキーは、本当に長い時間が続くこのオープン設定を行うにしたいでしょう/ session.jsを開き、必要に応じてcookieのmaxAgeを編集します。たとえば、あなたは、すべて365日ログインするユーザーを強制したい場合、あなたはこのようないくつかの操作を行うことがあります

// milliseconds * seconds * minutes * hours * days 
cookie: { 
    maxAge: 1000 * 60 * 60 * 24 * 365 
}, 

バックこのオプションへの引き分けは、アプリケーションを再起動し、すべてされている場合、あなたのセッションが失われることですユーザーは再度ログインする必要があります。

オプション2: passwordlessのような単純なサードパーティライブラリを使用してください。迅速なWebアプリケーションのためのトークンベースの認証を提供しています。

パスワードなしの一般的なジストは、ユーザーがサインアップしたときに電子メールでアプリケーションへのリンクを配信します。ログインしてセッションを設定します。パスワードなしでは、セッションストアとしてmongoを使用するので、mongoをインストールするか、Mongo Database-a-a-ServiceプロバイダであるmLabのようなものを使用できます。パスワードなしで完全に実行するには、開始ページhereをご覧ください。

ここでは、より機能に基づいたオプションについて説明します。

オプション3:あなたは公共直面しているアプリケーションを開発している場合 、帆とPassport.jsを利用することは素晴らしい選択肢です。

PassportはNode.js用の認証ミドルウェアです。非常に柔軟でモジュラーなパスポートは、ExpressベースのWebアプリケーションに邪魔にならないようにすることができます。包括的な戦略は、ユーザー名とパスワード、Facebook、Twitterなどを使用した認証をサポートします。

Passportは、Expressと同じようにSailsで動作します。

すでにエーテルにパスポートを設定する際のガイドが表示されています。しかし、偉大なステップバイステップはhereが利用可能であり、公式文書hereの帆によって参照されるものでもあります。

Passportはすべて認証ミドルウェアです。ユーザーはこの認証に基づいて自分自身を識別することができます。アプリケーションで正しい認証機能を開発できます。

オプション4: SAMLまたはOAuthを使用します。開発と実装の観点から、これは提供されているオプションの中で最大の事業です。

SAMLとOAuthは、誰が何をすることができるかを決定するルールを参照する認可ミドルウェアです。両方とも、IDPがフロー内のユーザーを認証するオンラインサービスを表し、SPが信頼できるIdPを認証に使用するアプリケーションを表すアイデンティティプロバイダ(IdP)およびサービスプロバイダ(SP)を使用します。承認。

私はSAMLをよりよく理解しています。したがって、次に示すのは、プロジェクトにSAMLを実装する際の考慮事項です。

まず、アプリケーション(SP)をIdPで登録する必要があります。 IdPに関しては、アプリケーションの規模と要件に基づいて選択し、ZXIDPSSOCircleのような無料のオンラインIdPがあります。アプリケーションに専用のIdPが必要な場合は、OpenSSOのように見えます。 saml-idp packageを使用して独自のNode.js IdPを作成することもできます。

SAMLをセイルアプリケーションに統合することはあまり難しくありません。 saml2-js packageを使用してください。

すべての設定が完了すると、ロジックは次のように動作します。

  1. ユーザーがWebブラウザを開き、yoururlに移動します。

  2. ユーザーを認証するために、yoururlはSAML Authnrequestを作成、署名、暗号化、エンコードします。

  3. 次に、yoururlはユーザーをIdPにリダイレクトして認証します。

  4. IdPは、最初のサインアップ/ログイン時にIdPがユーザー名とパスワードの入力を要求します。その後、セッションバーを使用し、ブラウザのアドレスバーのアドレス変更以外を使用します。ユーザーはそれほど多くは見えません。

  5. ユーザーが正常に認証された場合、IdPはユーザーに関する情報(ユーザー名など)を含むSAMLトークンを生成し、このトークンを使用してユーザーをyouurlにリダイレクトします。

  6. は最後にyoururlは、権限を含むユーザに関する識別情報を抽出し、それらをログに記録し、SAMLトークンを検証します。

関連する問題