Passport.jsの仕組み



PassportJSは、node.jsでの承認用ミドルウェアです。 Passportは、VKontakteやその他のtwitterを含む膨大な数のサービスを通じて認証をサポートしています。 サービスのリストはここで表示できます 。 ログインとパスワードを使用した最も一般的な承認の例で、このミドルウェアがどのように機能するかについて少しお話したいと思います。



最も焦っている人は、完成したプロジェクトをここで見ることができます



依存関係:







便宜上、いくつかの追加ユーティリティも使用します。 それらなしで行うことはかなり可能です:







ユーザーモデル



まず、ユーザーモデルを作成できると思います。

var UserSchema = new mongoose.Schema({ username: { type: String, unique: true, required: true }, password: { type: String, required: true }, }); mongoose.model('user', UserSchema);
      
      







ここでは、パスワードにソルトを適用し、セキュリティの神にいくつかのセキュリティマジックを追加することができますが、私はあなたに任せます=)。



認可戦略





検証


承認戦略を接続して構成します。

 var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function(username, password,done){ User.findOne({ username : username},function(err,user){ return err ? done(err) : user ? password === user.password ? done(null, user) : done(null, false, { message: 'Incorrect password.' }) : done(null, false, { message: 'Incorrect username.' }); }); }));
      
      







LocalStrategyは、2つのパラメーターを受け入れます。ユーザー検証用のオプションとミドルウェアを持つオブジェクトです。

デフォルトでは、 `LocalStrategy`にオプションが渡されない場合、戦略は名前` username`と `password`でフォーム内のユーザーを認証するためのパラメーターを探します。 必要に応じて、実際に行ったようにフォーム名を指定できます。

2番目の引数-ミドルウェア-は、パラメーター「ユーザー名」、「パスポート」、および「完了」を取ります。 完了した場合、2番目の引数はユーザーオブジェクト(存在する場合)です。



ユーザーへの承認のバインド


一般的なWebアプリケーションでは、ユーザーの認証に使用される資格情報は、承認時にのみ送信されます。 すべてが正常であり、ユーザーが存在する場合、ユーザーに関する情報はセッションに保存され、セッション識別子はブラウザーのCookieに保存されます。



その後の各リクエストにはCookieが含まれ、これによりパスポートはユーザーを識別し、セッションから彼のデータを取得できます。 セッションからユーザーデータを保存または取得するために、パスポートは関数 `passport.serializeUser()`および `passport.deserializeUser()`を使用します。



 passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err,user){ err ? done(err) : done(null,user); }); });
      
      







PassportをExpressに接続する



わかりました。PassportをExpressに接続する必要があります。



 // Middlewares,      passport: app.use(express.cookieParser()); app.use(express.bodyParser()); app.use(express.session({ secret: 'SECRET' })); // Passport: app.use(passport.initialize()); app.use(passport.session());
      
      







ルーターとコントローラーの作成



ルータを構成する時が来ました。 クエリを対応するコントローラーにバインドします。



 // Auth system app.post('/login', controllers.users.login); app.post('/register', controllers.users.register); app.get('/logout', controllers.users.logout);
      
      







次に、コントローラー自体を作成します。

 //   ,       ,    . // , passport.authenticate()   req.logIn ,      .     . ,    console.log(),  ,  ... //         req.user module.exports.login = function(req, res, next) { passport.authenticate('local', function(err, user, info) { return err ? next(err) : user ? req.logIn(user, function(err) { return err ? next(err) : res.redirect('/private'); }) : res.redirect('/'); } )(req, res, next); }; //    =) module.exports.logout = function(req, res) { req.logout(); res.redirect('/'); }; //  .     ,   ,  ,   `req.logIn`,   module.exports.register = function(req, res, next) { var user = new User({ username: req.body.email, password: req.body.password}); user.save(function(err) { return err ? next(err) : req.logIn(user, function(err) { return err ? next(err) : res.redirect('/private'); }); }); };
      
      







認可チェック



承認の検証は、req.isAuthenticated()を使用して実行できます。 ミドルウェアをチェックインします。



 exports.mustAuthenticatedMw = function (req, res, next){ req.isAuthenticated() ? next() : res.redirect('/'); };
      
      







そして、ルートに追加します。



  App.all('private', mustAuthenticatedMw); App.all('private/*', mustAuthenticatedMw);
      
      







HTML



登録フォーム、認証、ログアウトボタンを作成することは残ります。



登録:

 h4 Register your account form(action='/register' method='post') fieldset label(for='email') Email input(type='email' name='email' placeholder='Your Email') label(for='password') Password input(type='password' name='password' placeholder='Your Password') button(type='Register')
      
      







ユーザー名

 h4 Login to your account form(action='/login' method='post') fieldset label(for='email') Email input(type='email' name='email' placeholder='Your Email') label(for='password') Password input(type='password' name='password' placeholder='Your Password') button(type='Login')
      
      







ログアウト

 a(href='/logout') logout
      
      







さて、あなたは実行して仕事を確認することができます。 何百ものコードを書き直さないために、GitHubでリポジトリをフォークできます



All Articles