2017-11-06 12 views
0

私はちょうどpassport.jsで開始しました。 this articleから、私はすべてのパスポートメソッドの流れを得て、私のアプリケーションで同じものを実装しています。ここにserver.jsがあり、私はpassport-local戦略を使用しています。私はそれが私がpassport.jsのdeserializeUserメソッドのメリット

app.use(express.static(__dirname + "/public")); 

使用していたとしてのindex.htmlページを提供しており、これは角度のアプリで、理由角度のlocalhost:7000を打ったときの角度アプリは、同じサーバー

import { registerControllersFromFolder } from 'giuseppe'; 
import { MessageManager } from './messaging/MessageManager'; 
import express = require('express'); 
import bodyParser = require('body-parser'); 
import session = require("express-session"); 
import http = require('http'); 

// class to hold user info 
class User { 
    userId: number; 
    userName: string; 
    constructor(userId: number, userName: string) { 
     this.userId = userId; 
     this.userName = userName; 
    } 
} 

// server class to create http server 
export class Server { 
    // list of apis for which authentication is not required 
    private static publicApiList: string[] = ["/services/login", "/login", "/favicon.ico"]; 

    // request interceptor that will check user authentication 
    private static isAuthenticated = (req, res, next) => { 
     console.log("Authenticating :", req.originalUrl); 
     if (req.isAuthenticated() || Server.publicApiList.indexOf(req.originalUrl) > -1) { 
      // express routing 
      if (req.originalUrl.startsWith("/services")) { 
       console.log("Express Routing"); 
       return next(); 
      } else { // angular routing -> return index.html 
       console.log("Angular Routing"); 
       return res.sendFile(__dirname + "/public/index.html"); 
      } 
     } else { 
      console.log("User not authenticated.") 
      res.redirect('/'); 
     } 
    }; 

    static startServer() { 
     let userList: User[] = [new User(1, "Sunil"), new User(2, "Sukhi")]; 

     let app = express(); 

     // passport library 
     let passport = require('passport'); 
     let LocalStrategy = require('passport-local').Strategy; 

     // middlewares 
     app.use(express.static(__dirname + "/public")); 
     app.use(bodyParser.json()); 
     app.use(bodyParser.urlencoded({ extended: false })); 

     app.use(session({ resave: false, saveUninitialized: true, secret: "secretKey123!!" })); 

     // passport middleware invoked on every request to ensure session contains passport.user object 
     app.use(passport.initialize()); 

     // load seriliazed session user object to req.user 
     app.use(passport.session()); 

     // Only during the authentication to specify what user information should be stored in the session. 
     passport.serializeUser(function (user, done) { 
      console.log("Serializer : ", user); 
      done(null, user); 
     }); 

     // Invoked on every request by passport.session 
     passport.deserializeUser(function (user, done) { 
      let validUser = userList.filter(user => user.userId === user.userId)[0]; 
      console.log("D-serializer : ", validUser); 
      done(null,validUser); 
     }); 

     // passport strategy : Only invoked on the route which uses the passport.authenticate middleware. 
     passport.use(new LocalStrategy({ 
      usernameField: 'name', 
      passwordField: 'password' 
     }, 
      function (username, password, done) { 
       console.log("Strategy : Authenticating if user is valid :", username) 
       let user = userList.filter(user => username === user.userName); 
       console.log("Valid user : ", user) 
       if (!user) { 
        return done(null, false, { message: 'Incorrect username.' }); 
       } 
       return done(null, user[0]); 
      } 
     )); 

     // intercept request for authentication 
     app.use(Server.isAuthenticated); 

     app.post('/services/login', passport.authenticate('local', { 
      successRedirect: '/profile', 
      failureRedirect: '/login' 
     })); 

     app.get('/services/logout', (req: any, res: any) => { 
      req.logout(); 
      console.log("User Logout"); 
      res.send("{status:'logout'}") 
     }); 

     // http server creation 
     let server = http.createServer(app); 
     registerControllersFromFolder({ folderPath: './api' }) 
      .then(router => { 
       app.use(router); 
       /* start express server */ 
      }) 
      .catch(err => { 
       /* error happened during loading and registering */ 
      }); 

     server.listen(7000,() => { 
      console.log('Up and running on port 7000'); 
     }); 
    } 
} 

exports.startServer = Server.startServer; 

// Call a module's exported functions directly from the command line. 
require('make-runnable'); 

にAPIを休ませ、ルーティングloginモジュールがデフォルトでロードされます。私はリクエスト認証をチェックするミドルウェアを使用しており、真の場合はリクエストプレフィックス(角度または明示)に基づいてルーティングが行われます。

ログインリクエストで定義されたローカル戦略方法が呼び出され、これが真であれば、要求セッションでデータを保存する責任を負うserializerメソッドが呼び出されます。 sucessRedirectまたはfailureRedirectが呼び出されます。

私は、req.isAuthenticatedが真であるかどうかをチェックするミドルウェアを使用していました。要求が提供されていないと、ユーザーはログインページにリダイレクトされます。それ以降のリクエストで、メソッドが呼び出され、serializeUserメソッドによってログイン要求に格納されたオブジェクトが含まれていることがわかりました。ドキュメントごとに、これは有効なユーザーを確認するためにデータベースを呼び出します。

しかし、私は混乱していますが、deserializeUserメソッドの実際の使用例ですか?私は、要求をecah傍受しreq.isAuthentictedを確認していた場合、どこで、なぜdeserializeUser方法でデータベースを呼び出すために)(この方法の利点を取ることができ?>

答えて

0

this answer

最初の引数で述べたようにdeserializeUserは、done関数に与えられた ユーザーオブジェクトのキーに対応します(1.を参照)。したがって、あなたの オブジェクト全体がそのキーの助けを借りて検索されます。そのキーは ユーザーIDです(キーはユーザーオブジェクトの任意のキー(名前、電子メールなど)です)。 deserializeUserでは、キーがメモリ内の配列/ データベースまたはデータリソースと一致しています。

フェッチされたオブジェクトがreq.user

としてリクエストオブジェクトに添付されてこのように、deserializeUserの利点は、あなたがそれ以降のすべてのリクエストに応じて利用可能なユーザーオブジェクトを持っていることです。

あなたがreq.isAuthenticatedを呼び出す場合deserializeUserを使用する必要がある理由あなたが尋ねると、答えはreq.isAuthenticatedの実装である:

req.isAuthenticated = function() { 
    var property = 'user'; 
    if (this._passport && this._passport.instance) { 
    property = this._passport.instance._userProperty || 'user'; 
    } 

    return (this[property]) ? true : false; 
}; 

私にとって、req.isAuthenticatedを設定するreq[user]を探しているように見える、としたがって、動作させるには、deserializeUserを呼び出す必要があります。

+0

私は 'req.isAuthenticated'を適用するためにチェックする要求を傍受しています。偽であれば、失敗した応答で要求から戻ってきます。とにかくユーザープロファイルはreq.session.passportにあります –

+0

if文で 'req.isAuthenticated()'を呼びますが、あなたが提供したコードで 'req.session.passport'を使用しているとは思われません。あなたの質問をもっと説明できますか? –

+0

私の質問では、私はすべての要求を傍受し、 'req.isAuthenticated'が真であるかどうかをチェックし、その要求に基づいてサービスが提供されているかどうかを確認しました。私はここで 'deSerializerUser'メソッドの役割は何か分かりません。 'deSerializerUser'からどのようなメリットが得られるのか説明できますか? –