web-dev-qa-db-ja.com

リダイレクトせずにPassportで認証できますか?

パスポートローカル戦略を通じて認証するための次の作業コードがあります。

  app.post('/api/login', passport.authenticate('local-login', {
    successRedirect : '/api/login/success',
    failureRedirect : '/api/login/error',
    failureFlash : true
  }));
  app.get('/api/login/error', function(req, res) {
    res.send(401, {error: req.flash('loginMessage')});
  });
  app.get('/api/login/success', function(req, res) {
    res.send(200, {user: req.user});
  });

ただし、理想的には、1つの高速ルートからのエラーメッセージと成功メッセージを処理し、2つの追加ルートにリダイレクトしないようにします。

これは可能ですか? 「カスタムコールバック」を使用してみましたが、何らかの理由でユーザーのシリアル化でエラーが発生したようです。

13
Hyra

次のようなカスタムコールバックを使用できます。

passport.authenticate('local', function (err, account) {
    req.logIn(account, function() {
        res.status(err ? 500 : 200).send(err ? err : account);
    });
})(this.req, this.res, this.next);

Errオブジェクトでは、認証時に表示された必要なすべてのエラーを見つけることができます。

8
magmel

マングースを使用していますか?これをserver.js/index.jsに追加してみてください

_var User = mongoose.model('User');
passport.use(new LocalStrategy(User.authenticate()));
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
_

これをあなたのルートindex.jsに

_var auth = require('./auth');
app.post('/api/auth/login', passport.authenticate('local'),auth.login);
_

auth.js:

_var UserModel = require('../models/user');
var User = new UserModel();

exports.login = function(req, res) {
    var user = req.user;
    req.login(user, function(err) {
        //if error: do something
        return res.status(200).json(user)
    });
};
_

これをモデルindex.jsに追加します

_var passportLocalMongoose = require('passport-local-mongoose');
userSchema.plugin(passportLocalMongoose, {
    usernameField: 'email',
    usernameLowerCase: 'true'
});
_

私はここで構造とパッケージについて多くの仮定をしています。しかし、これはうまくいくはずです

[〜#〜]編集[〜#〜]

カスタムコールバックの場合:

_app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});
_

ここでは、_res.redirect_の代わりにreturn res.status(404).json("Not Found)のようなものを使用できます

詳細については、ドキュメントを参照してください: http://passportjs.org/guide/authenticate/

5
Clto