2

我目前正在使用Node.jsand构建一个网络应用程序Express.js

我正在寻找一种在我的主app.js文件中使用用户名和密码进行简单服务器端身份验证的方法,该文件正在侦听以下post请求http://www.domain.com/login

应用程序.js

app.post('/login', function(req, res) {
  // some server-side code for a username and password
}

在客户端,我有一个带有用户名和密码的简单登录表单。此表单将发布到服务器:

索引.html

<form method="post" action="/login">
<input type="text" id="user" name="user" />
<input type="password" id="pass" name="pass" />
<button type="submit">Login</button>
</form>

我希望在使用任何ExpressJS插件的情况下实现这一目标。

编辑:所以我的问题是,如何在 ExpressJS 和 NodeJS 中实现简单的用户名和密码认证?

4

3 回答 3

9

通过使用 ExpressJS 会话,您可以持有会话 cookie。您需要 cookieParser 和会话存储。但是,如果您不想扩展此 ExpressJS 功能(这是我从您的消息中了解到的),您应该使用令牌或秘密临时字符串管理您自己的会话。

尽管我强烈建议您使用 ExpressJS 会话,但在没有 ExpressJS cookie 的情况下您应该这样做。

  • 每次登录时,创建一个唯一令牌并将其存储以供将来查找。
  • 在每个请求上,从客户端发送该令牌并在服务器上检查它。如果令牌无效,则重定向到登录

这是登录代码示例:

app.post("/login", function(req, res) {
    if(req.body.username && req.body.password) {
        // check username and password
        if(authenticated) {
            // create a token and store it with the current date (if you want it to expire)
            var token = generateAndStoreRandomString(req.body.username);
            res.redirect("http://your.domain/path?token=" + token);
            return;
        }
        // Do something if username or password wrong
    }
    // Do something if no username or password
});

现在,对于每个请求:

app.get("somePath", function(req, res) {
    if(!req.query.token) {
        res.redirect("http://your.domain/login");
        return;
    }
    // Check token in database, if it exists and it hasn't expired
    if(!authenticated) {
        res.redirect("http://your.domain/login");
        return;
    }
    // The user is authenticated. Do the actions required by "somePath"
});

尝试让一个进程每隔一段时间清理一次过期的令牌,因为它们最终会加起来。如果你想使用 ExpressJS cookieParser 和 session store,有很多文章和例子。如果您遇到问题,请发布另一个问题。

我再重复一遍,尝试使用 ExpressJS 会话。如果你使用http而不是https,这种方法很容易被劫持。

于 2012-12-26T10:17:10.647 回答
4

这很简单。ExpressJS 是一个超小型框架,它构建在 Node.js 和 connect 中的基本 http 服务器之上,它是一个节点模块。

要创建身份验证系统,您将使用会话。首先,您需要调用此行:

app.use(express.cookieSession());

然后,您将能够使用req.session来存储和加载会话。

app.post('/login', function(req, res) {
    if (req.session.username & req.session.password != null) {
       // Already logged in.
    } else {
       var q = db.query("SELECT * FROM `users` WHERE `username`='" + req.params.username + "' AND `password`='" + req.params.password + "'");

       if (q) {
          // Set the sessions.
          req.session.username = req.params.username;
          req.session.password = req.params.password;
       }
    }
});

一个基本的例子。您肯定必须清理输入并保护它,但它应该让您开始。

于 2012-12-26T03:09:09.123 回答
2

Connect我使用包含的中间件找到了我正在寻找的答案ExpressJS无需使用 cookie 或添加另一个 Node 模块:

var express = require('express');

function authorize(username, password) {
    return 'someone' === username & 'password' === password;
}

var app = express.createServer(
    express.basicAuth(authorize)
);

app.get('/', function(request, response) {
    response.send('Authorized!');
});

console.log('Starting server...')
app.listen(8080);

运行应用程序并导航到 后http://localhost:8080,它会提示输入用户名和密码。简单的。

于 2012-12-26T12:39:46.143 回答