1

我正在尝试构建一个身份验证系统并且我有 app.js

var express = require('express')
  , MemoryStore = require('express').session.MemoryStore
  , app = express();

app.use(express.cookieParser());
app.use(express.session({ secret: 'keyboard cat', store: new MemoryStore({ reapInterval: 60000 * 10 })}));
app.use(app.router);

和 route.index 作为

var express = require('express')
  , mysql = require('mysql')
  , crypto = require('crypto')
  , app = module.exports = express();

app.get('/*',function(req,res){
    var url = req.url.split('/');
    if (url[1] == 'favicon.ico')
        return;

    if (!req.session.user) {
        if (url.length == 4 && url[1] == 'login') {     
            var connection = mysql.createConnection({
                host     : 'localhost',
                user     : 'user',
                password : 'pass',
            });
            var result = null;
            connection.connect();
            connection.query('use database');
            var word = url[3];
            var password = crypto.createHash('md5').update(word).digest("hex");
            connection.query('SELECT id,level FROM users WHERE email = "'+url[2]+'" AND password = "'+password+'"', function(err, rows, fields) {
              if (err) throw err;
                for (i in rows) {
                    result = rows[i].level;
                }
                req.session.user = result;
            });
            connection.end();
        }
    }

console.log(req.session.user)

当我第一次访问http://mydomain.com/login/user/pass时,它显示在最后一次控制台调用中,但第二次访问时 cookie 是干净的

4

2 回答 2

2

为什么不直接使用 Express 的会话处理?如果您使用 express 命令行工具,因为express --sessions它将创建具有会话支持的项目模板。从那里您可以将会话行复制到您当前的项目中。在如何使用 Node.js 在 Express.js 中进行会话?(这看起来可能是重复的)

至于清理 SQL,您似乎正在使用该库,如果您使用参数化查询(即 ? 占位符),它将为您的输入清理。

最后一件事,您使用 Express 错误(没有冒犯)。Express 的路由器将允许您拆分很多路由(同时允许您配置 favicon。请参阅Unable to Change Favicon with Express.js(第二个答案)。使用“/*”路由只会捕获所有 GET 请求,这极大地限制路由器可以为您做的事情。

(接评论;把它放在这里作为代码块)现在你有一个支持会话的应用程序,试试这两条路线

app.get('/makesession', function (req, res) {
    req.session.message = 'Hello world';
    res.end('Created session with message : Hello world');
});
app.get('/getsession', function (req, res) {
    if (typeof req.session.message == 'undefined') {
        res.end('No session');
    } else {
        res.end('Session message: '+req.session.message);
    }
});

如果您在浏览器中导航到 /makesession,它会设置一个会话消息并通知您它确实如此。现在,如果您导航到 /getsession,如果会话消息存在,它将向您发送回会话消息,否则它将告诉您会话不存在。

于 2013-03-06T20:26:35.423 回答
0

您需要将 cookie 值保存在响应对象中:

res.cookie('session', 'user', result);

http://expressjs.com/api.html#res.cookie

于 2013-03-06T20:18:41.040 回答