您可以在不重定向的情况下使用 Passport 进行身份验证吗?

Posted

技术标签:

【中文标题】您可以在不重定向的情况下使用 Passport 进行身份验证吗?【英文标题】:Can you authenticate with Passport without redirecting? 【发布时间】:2015-01-07 16:11:28 【问题描述】:

我有以下工作代码通过本地护照策略进行身份验证:

  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】:

可以使用自定义回调,如:

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 对象中,您可以找到所有需要的错误,这些错误在身份验证时出现。

【讨论】:

完美!您是否碰巧知道本地注册是否有 req.logIn 的等价物?除此之外,非常感谢! 只需要编写其他策略,调用函数注册新用户【参考方案2】:

你在用猫鼬吗? 尝试将此添加到您的 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);
);

在这里,您可以使用 return res.status(404).json("Not Found) 之类的东西来代替 res.redirect

有关更多信息,请参阅文档:http://passportjs.org/guide/authenticate/

【讨论】:

就身份验证而言,一切正常,只是回调(在您的情况下为 auth.login)仅在登录成功时才被触发。我也想在失败时给出消息,这是你在策略中无法做到的。 感谢@Clto,你无意中回答了我的 4 个随机问题 你也有用户模型吗?

以上是关于您可以在不重定向的情况下使用 Passport 进行身份验证吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不重定向到外部登录页面的情况下进行 SPA 身份验证

如何在不重定向原始 URL 的情况下获取短 URL 服务的信息或实际信息

如何在不重定向的情况下从数据库实时更新赞成票和反对票数?

是否可以在不使用 WooCommerce 重定向到 PayPal 网站的情况下进行 PayPal 付款?

jquery:更改URL地址而不重定向? [复制]

javascript更改get参数而不重定向[重复]