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.indexas

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に最初にアクセスすると、最後のコンソールコールに表示されますが、2回目にアクセスするとCookieはクリーンです。

4

2 に答える 2

2

Expressのセッション処理だけを使用しないのはなぜですか?エクスプレスコマンドラインツールを使用するexpress --sessionsと、セッションをサポートするプロジェクトテンプレートが作成されます。そこから、セッションラインを現在のプロジェクトにコピーできます。Express.jsとNode.jsでセッションがどのように機能するかについての詳細がありますか?(これは重複しているように見えます)

SQLのサニタイズに関しては、ライブラリを使用しているようです。ライブラリは、パラメータ化されたクエリ(つまり、?プレースホルダー)を使用する場合に入力をサニタイズします。

最後に、Expressを間違って使用しています(違反はありません)。Expressのルーターを使用すると、多くのルートを分割できます(ファビコンを構成できます。Express.jsでファビコンを変更できない(2番目の回答)を参照してください)。「/ *」ルートを使用すると、すべてのGETリクエストがキャッチされます。ルーターが実行できることを制限します。

(コメントから続く;コードブロックのためにここに置く)これで、セッションをサポートするアプリができたので、次の2つのルートを試してください。

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 に答える