- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我没有登录页面,而是在每个页面上都有一个登录表单。无论身份验证是否成功(使用适当的闪存消息),我都想将用户重定向回他们所在的同一页面
取以下代码:
app.post('/login', validateLogin, passport.authenticate('local-login'), function(req, res) {
var redirectUrl = '/';
if(req.body.to.length > 0){
redirectUrl = req.body.to;
}
console.log("THIS IS ONLY CALLED IF passport.authenticate() IS SUCCESSFUL");
res.redirect(redirectUrl);
});
如果身份验证通过,我只会看到上面的最终中间件被调用。如果失败,则 Passport 似乎以获取请求的形式将我重定向到/login。在我的应用中,此页面不存在。
如果我在 Passport 身份验证函数中传递一个额外的选项对象作为参数,那么它可以工作:
app.post('/login', validateLogin, passport.authenticate('local-login', {
successRedirect : '/', // redirect to the secure profile section
failureRedirect : '/signup', // redirect back to the signup page. THIS IS JUST FOR TESTING TO SEE IF THE REDIRECT ON FAIL WORKS.
failureFlash : true, // allow flash messages
}
));
但是这样做我失去了选择将用户重定向到哪里的能力。如果身份验证失败, Passport 似乎可以控制用户被重定向到的位置。我怎样才能解决这个问题?或者它是一个错误?如果身份验证失败, Passport 身份验证必须是链中的最后一个中间件吗?
这是我的本地策略函数调用:
//LOCAL LOGIN
passport.use('local-login', new LocalStrategy({
// by default, local strategy uses username and password, we will override with email
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true // allows us to pass back the entire request to the callback
},
function(req, email, password, done) { // callback with email and password from our form
console.log("IN PASSPORT");
if(email.length == 0 || password.length == 0){
console.log("FIELDS ARE EMPTY");
return done(null, false, req.flash('loginMessage', 'Fill in all values.'));
}
// find a user whose email is the same as the forms email
// we are checking to see if the user trying to login already exists
User.findOne({ 'local.email' : email }, function(err, user) {
// if there are any errors, return the error before anything else
if (err){
return done(err);
console.log("db err");
}
// if no user is found, return the message
if (!user){
console.log("not user");
return done(null, false, req.flash('loginMessage', 'Incorrect details.')); // req.flash is the way to set flashdata using connect-flash
}
// if the user is found but the password is wrong
if (!user.validPassword(password)){
console.log("invalid pw");
return done(null, false, req.flash('loginMessage', 'Incorrect details.')); // create the loginMessage and save it to session as flashdata
}
// all is well, return successful user
console.log("All OK");
return done(null, user);
});
}));
最佳答案
您可以使用上一段中所述的自定义身份验证回调 http://passportjs.org/guide/authenticate/ .
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) { return next(err); }
// Redirect if it fails
if (!user) { return res.redirect('/login'); }
req.logIn(user, function(err) {
if (err) { return next(err); }
// Redirect if it succeeds
return res.redirect('/users/' + user.username);
});
})(req, res, next);
});
关于node.js - Nodejs 和 PassportJs : Redirect middleware after passport. 如果身份验证失败,则不会调用身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22858699/
我只想在还有用户后链接twitter帐户。 首先我有一个这样的 router.js // GET Registration Page router.get('/signup', function(re
已经与这个问题搏斗了 2 天了 :) 希望得到一些帮助。 我正在尝试使用passportjs+sqlite+sequelize构建快速身份验证, 1)当我将路由放在 app.use(passport.
我试图找出我的身份验证代码中的错误所在,该代码在每次尝试登录时都会创建一个无限循环。我认为它在我的代码的本地策略 passport.use('local', new LocalStrategy 部分内
我正在尝试使用 Passport js 实现本地身份验证并在 express 中进行 sequalize。我遇到的问题是成功回调永远不会在成功认证时触发。日志显示用户已找到,但用户对象从未登录到请求回
我正在使用 passportjs 进行用户身份验证。在官方指南中,唯一展示的用户案例是认证后的重定向操作: app.post('/login', passport.authenticate('lo
我有一个订购单,用户需要先注册才能订购,所以我可以创建一个帐户然后像这样处理订单。 router.post('/project/new', passport.authenticate('local-s
因此,我使用关系和 PassportJS 在我的 Node 应用程序中对用户进行身份验证。我找不到有关 Passport 本地策略中第一个参数的作用的信息。这个对象是否为用户提供了一个存储在MySQL
我做错了什么?它总是重定向到失败页面,但我无法调试。 // passport var passport = require('passport'), LocalStrategy = requi
我有一个应用程序使用与 Passport 捆绑在一起的所有 oAuth 身份验证,但我正在使用外部服务来创建我的数据库/用户。 如果我这样做: passport.use('local-signup',
使用passportjs进行身份验证。当用户注册时,我希望出现一条消息,让他们知道他们现在可以使用自己的帐户登录。截至目前,注册还会将它们记录下来,这会导致我的通知关闭: “您现在可以注册” “您已经
我正在使用 Passportjs 进行 Facebook 身份验证。这是我的 Facebook 策略: passport.use(new FacebookStrategy({ clie
我正在使用 express 和 passport 构建一个 rest api 后端,我的 localStrategy 似乎没有按要求被调用。 我的应用程序的入口点如下所示: app.js var fs
我是 javascript 和 Node 的新手。我按照 passportJS 的指南进行操作,但收到错误消息“找不到本地策略”。我不知道为什么。我的代码,此时基本上取自网站。 var express
下面是我的代码 restify = require("restify") passport = require("passport") GoogleStrategy = require("passpo
所以我正在处理提供的信息 here添加 Google 将重定向到用户在重定向到 google 之前所在页面的功能。我目前使用的是最新版本的 Express、PassportJS 和 Google oa
我的问题与PassportJS - Using multiple passports within Express application有关话题。 因此,只要我已经有两个单独的 Passport 实
我将 sequelize.js 用于我的数据存储,并将 github 策略与 passport.js 一起使用。我的代码是: app.use(passport.initialize()); app.u
尝试使用passport-JWT实现登录。注册和登录都工作正常, token 在登录时生成并发送到客户端,客户端存储并返回它。 登录身份验证请求到达应用程序后没有任何反应..帮助? :) 智威汤逊战略
这个问题已经有答案了: Understanding Passportjs Custom Callback (3 个回答) 已关闭 6 年前。 我无法理解 Passport.js 的自定义回调发生了什么
我正在玩弄 Passport ,并以这种方式配置我的 Twitter 登录: passport.use(new TwitterStrategy({ consumerKey: '*****',
我是一名优秀的程序员,十分优秀!