如何通过Node.JS创建经过身份验证的登录?

时间:2017-08-17 20:20:35

标签: node.js loops authentication redirect login

所以我最终试图在节点中创建一个登录页面。如果某人尝试前往其他位置,则应将其路由到登录页面。

我正在使用“/”作为重定向到“/ login /”。 “/ login /”包含输入用户名/密码的表单。一旦他们输入信息,它就会路由回“/”。

遇到一些问题。如果我排除了重定向的代码,如果原始网址是“/”而某人转到“/ login /”那么他们可以填写表单并重定向。

如果我保留重定向的代码,它会自动重定向到登录页面,然后由于重定向而重新加载到登录页面。这是一个我无法摆脱的怪异循环。我知道我可以把另一端放到“/ login /”但我想保留它“/”。

有关修复重定向循环的任何想法?编辑:所以我知道问题是什么。我不存储用于比较(不使用会话)。有关用于检查会话的最佳中间件的任何线索吗?

如何添加身份验证甚至将用户名/密码添加到数据结构?

以下是我提出的代码:

 const express = require("express"); //Express
 const path = require ("path");
 const session = require("express-session"); //Express Session
 const app = express();
 const mustache = require ("mustache");
 const mustacheExpress = require('mustache-express');
 const bodyParser = require ("body-parser");

 app.use(bodyParser.json());
 app.use(bodyParser.urlencoded({extended:true}));

app.engine('mustache', mustacheExpress());
app.set('views', './views')
app.set('view engine', 'mustache')

app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false,
  cookie:{}
 }));

app.use((req, res, next) => {
    if (req.originalUrl === '/') {
    res.redirect("/login/");
  }
  next();
});


const list = [
  {
    username: "",
    password: "",
   }
];

const data = {
  users:list
 };

 app.get('/login/', function (req, res) {
   res.render("users", data);
});


app.post("/", function(req, res){
  console.log(req.body);
  let username = req.body.username;
  let password = req.body.password;
  let response = `Here are your credentials for the site: <br/>
  This is your username: ${username} <br/>
  This is your password: ${password} <br/>
  <img src="http://media1.giphy.com/media/c54YHGDH63jJC/giphy.gif"/>`
  res.send(response);
});

app.post("/", function (req, res) {
  console.log(list);
  list.push({username:req.body.username});
  list.push({username:req.body.password});
  res.redirect('/');
})

app.listen(3000, function () {
  console.log('Creating login page');
})

2 个答案:

答案 0 :(得分:0)

如果每次用户点击根(/),他们都会被重定向到/ login,并且成功登录然后将它们重定向回root,你显然有一个我认为你知道的路由循环。

最简单的解决方案是建立一条新路线,引导用户成功登录,例如/ home。我看到你回复了一条回复,所以我会提供两种可能性。此外,对于相同的POST路由,您有2个不同的处理程序,这是不必要的。这就是我的建议:

app.post("/login", function(req, res){
  console.log(req.body);

  let username = req.body.username;
  let password = req.body.password;

  let response = `Here are your credentials for the site: <br/>
      This is your username: ${username} <br/>
      This is your password: ${password} <br/>
      <img src="http://media1.giphy.com/media/c54YHGDH63jJC/giphy.gif"/>`;

  // actions from duplicate route handler
  console.log(list);

  list.push({username:req.body.username});
  list.push({username:req.body.password});

  // this is assuming you are handling errors on the front end
  res.status(201).send(response);

});

然后,我会根据您的api的成功响应,然后使用前端的javascript更改路线。

window.location.assign(urlToNewRoute);

或者,您可以将带有响应的重定向作为查询字符串发送,然后在前端解析,而不是发送res.status(201).send(响应)。

res.redirect(`/home?message=${response}`);

您想要如何设计api和前端站点真的取决于您。这些只是几个选项。实际上,您应该在POST路由中进行错误处理以检查用户是否存在,是否输入了正确的密码等,然后发回201,400,404或其他一些简洁状态,然后可以在前面处理端。

希望这有帮助。

答案 1 :(得分:0)

你是对的。您需要使用一些会话信息从/login/重定向到/。最简单的方法是返回控制器可以验证的令牌,如果它无效,可以重定向回/login/。您可以使用JWT作为令牌。