我正在try 使用node建立登录机制.js,express 和Passport .js.登录本身工作得很好,而且会话在redis中也存储得很好,但在提示用户进行身份验证之前,我确实在将用户重定向到起始位置时遇到了一些问题.

e、 g.用户跟踪链接http://localhost:3000/hidden然后被重定向到http://localhost:3000/login,但我希望他再次被重定向回http://localhost:3000/hidden.

这样做的目的是,如果用户随机访问他需要首先登录的页面,他将被重定向到提供其凭据的/login站点,然后被重定向回他之前try 访问的站点.

这是我的登录帖子

app.post('/login', function (req, res, next) {
    passport.authenticate('local', function (err, user, info) {
        if (err) {
            return next(err)
        } else if (!user) { 
            console.log('message: ' + info.message);
            return res.redirect('/login') 
        } else {
            req.logIn(user, function (err) {
                if (err) {
                    return next(err);
                }
                return next(); // <-? Is this line right?
            });
        }
    })(req, res, next);
});

这里是我的确认方法

function ensureAuthenticated (req, res, next) {
  if (req.isAuthenticated()) { 
      return next();
  }
  res.redirect('/login');
}

这与/hidden页有关

app.get('/hidden', ensureAuthenticated, function(req, res){
    res.render('hidden', { title: 'hidden page' });
});

登录站点的html输出非常简单

<form method="post" action="/login">

  <div id="username">
    <label>Username:</label>
    <input type="text" value="bob" name="username">
  </div>

  <div id="password">
    <label>Password:</label>
    <input type="password" value="secret" name="password">
  </div>

  <div id="info"></div>
    <div id="submit">
    <input type="submit" value="submit">
  </div>

</form>

推荐答案

我不知道Passport ,但我是这样做的:

我有一个用于app.get('/account', auth.restrict, routes.account)的中间件,在会话中设置redirectTo...然后我重定向到/login

auth.restrict = function(req, res, next){
    if (!req.session.userid) {
        req.session.redirectTo = '/account';
        res.redirect('/login');
    } else {
        next();
    }
};

routes.login.post年后,我会做以下事情:

var redirectTo = req.session.redirectTo || '/';
delete req.session.redirectTo;
// is authenticated ?
res.redirect(redirectTo);

Node.js相关问答推荐

Express 4.18正文解析

Stripe webhook无法访问Express请求原始正文

如何在JavaScript中使用Mongoose将项推送到MongoDB中的重嵌套数组

Mongoose抱怨说,整数是数字,而不是整数

MongooseError[MissingSchemaError]:尚未为模型注册架构

向url传递多个参数

mongoose findOneAndUpdate 不更新数据库

我应该转译我的 TypeScript 应用程序吗?

结合后端(Express)和前端(Angular)路由

如何防止 Chrome 通过 Selenium 崩溃?

获取用户 ID 后,Firebase 函数 onCreate 方法在 Firestore 上不起作用

MongoDB Atlas中的聚合触发器不起作用

Node.js 变量声明和范围

Node.js + Express + Handlebars.js + 局部视图

如何在 Node.js 中等待子进程完成

使用 NodeJS 将新对象附加到 DynamoDB 中的 JSON 数组

如何从 npm 注册表中删除 npm 包?

Bootstrap 中的 Grunt 依赖冲突

fs.createWriteStream 不会立即创建文件?

Npm postinstall 仅用于开发