Node.js用户名和密码身份验证
我目前正在使用Node.js用户名和密码身份验证,node.js,express,Node.js,Express,我目前正在使用Node.js和Express.js构建一个web应用程序 我正在寻找一种方法,在我的主app.js文件中使用用户名和密码进行简单的服务器端身份验证,该文件正在http://www.domain.com/login: app.js app.post('/login', function(req, res) { // some server-side code for a username and password } 在客户端,我有一个带有用户名和密码的简单登录表单。此表单将
Node.js
和Express.js
构建一个web应用程序
我正在寻找一种方法,在我的主app.js
文件中使用用户名和密码进行简单的服务器端身份验证,该文件正在http://www.domain.com/login
:
app.js
app.post('/login', function(req, res) {
// some server-side code for a username and password
}
在客户端,我有一个带有用户名和密码的简单登录表单。此表单将发布到服务器:
index.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中实现简单的用户名和密码身份验证?非常简单。ExpressJS是一个超小型框架,它在Node.js和connect(一个节点模块)中构建基本http服务器的ontop 要创建身份验证系统,您需要使用会话。首先,您需要拨打以下电话:
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;
}
}
});
一个基本的例子。您肯定必须清理输入并保护它,但它应该让您开始。使用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和会话存储,这里有很多文章和示例。如果你在这些问题上有困难,请再发一个问题
我将重复我自己,尝试使用ExpressJS会话。如果使用http而不是https,此方法很容易被劫持。我正在寻找使用ExpressJS
附带的Connect
中间件,无需使用cookie或添加其他节点模块:
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
,提示输入用户名和密码。简单。你能更具体一点吗?您实际上没有问任何问题。只是想补充一点,对于最新版本的Express,这是行不通的。您可以简单地使用:app.use(express.basicAuth('user','password');