【发布时间】:2015-05-10 21:57:26
【问题描述】:
我正在学习 node.js 和表达,并且正在研究 Brad Dayleys 书中的一些示例。我从书中复制了下面的代码,它使用加密和快速会话实现了一些基本的会话身份验证:
var express = require('express');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var crypto = require('crypto');
//encrypt password function
function hashPW(pwd) {
var hash = crypto.createHash('sha256').update(pwd).digest('base64');
return hash.toString();
}
var app = express();
//this is the new way to call this module
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(cookieParser('MAGICString'));
//new way to init session
app.use(session({secret: 'ssshhhhh', resave: false, saveUninitialized: false}));
//see if user is authorized to be here
app.get('/restricted', function(req, res) {
if (req.session.user) {
res.send ('<h2>' + req.session.success + '</h2>' +
'<p>You have entered the restricted section<p><br>' +
'<a href="/logout">logout</a>');
}
else {
req.session.error = 'Access denied';
res.redirect('/login');
}
});
app.get('/logout', function (req, res) {
req.session.destroy(function() {
res.redirect('/login');
});
});
app.get('/login', function(req, res) {
var response = '<form method="POST">' +
'Username: <input type="text" name="username"><br>' +
'Password: <input type="text" name="password"><br>' +
'<input type="submit" value="Submit"></form>';
if (req.session.user) {
res.redirect('/restricted');
} else if (req.session.error) {
response += '<h2>' + req.session.error + '</h2>';
}
res.type = ('html');
res.send(response);
});
//on form submit
app.post('/login', function (req, res) {
//user should be a lookup of req.body.username in database
var user = {name: req.body.username, password:hashPW("myPass")};
if (user.password === hashPW(req.body.password.toString())) {
req.session.regenerate(function() {
req.session.user = user;
req.session.success = 'Authenticated as ' + user.name;
res.redirect('/restricted');
});
} else {
req.session.regenerate(function() {
req.session.error = 'Authentication failed';
res.redirect('/restricted');
});
res.redirect('/login');
}
});
app.listen(8080);
当我运行时出现错误:
TypeError: Property 'type' of object #<ServerResponse> is not a function
at ServerResponse.send (/home/terry/myProjects/serverLearn/node_modules/express/lib/response.js:129:14)
at app.post.user.name (/home/terry/myProjects/serverLearn/express_auth_session.js:63:9)
at Layer.handle [as handle_request] (/home/terry/myProjects/serverLearn/node_modules/express/lib/router/layer.js:82:5)
at next (/home/terry/myProjects/serverLearn/node_modules/express/lib/router/route.js:110:13)
at Route.dispatch (/home/terry/myProjects/serverLearn/node_modules/express/lib/router/route.js:91:3)
at Layer.handle [as handle_request] (/home/terry/myProjects/serverLearn/node_modules/express/lib/router/layer.js:82:5)
at /home/terry/myProjects/serverLearn/node_modules/express/lib/router/index.js:267:22
at Function.proto.process_params (/home/terry/myProjects/serverLearn/node_modules/express/lib/router/index.js:321:12)
at next (/home/terry/myProjects/serverLearn/node_modules/express/lib/router/index.js:261:10)
at Object.<anonymous> (/home/terry/myProjects/serverLearn/node_modules/express-session/index.js:421:7)
请原谅我的菜鸟,但我就是看不出哪里出了问题。我什至不能告诉它到底哪里有错误。任何帮助或指示将不胜感激!
【问题讨论】:
-
只是想在您的代码中留下快速评论,我看到您正在使用 sha256 对您的密码进行哈希处理。这通常是一个非常糟糕的主意,我建议您使用更传统的密码哈希算法,例如 bcrypt:npmjs.com/package/bcryptjs 它会提高您的密码安全性并且非常易于使用!
标签: javascript node.js session authentication