49

Node.jsで記述された認証システムにRedisセッションを統合しようとしています。

connect-redisRedisサーバーとExpressサーバーを正常にセットアップできました。

これが私のセットアップです(重要な部分だけです):

var express = require("express");
var RedisStore = require("connect-redis")(express);
var redis = require("redis").createClient();

app.use(express.cookieParser());
app.use(express.session({
    secret: "thisismysecretkey",
    store: new RedisStore({ host: 'localhost', port: 6379, client: redis })
}));

さて...実際にセッションを作成、読み取り、破棄するにはどうすればよいですか?セットアップ方法に関するたくさんの記事connect-redisとここSOに関する多くの質問を読みましたが、それぞれが構成だけにとどまり、実際にそれを使用する方法を説明していないことを誓います...

それはおそらく非常に単純なことだと思いますが、反対票を投じずに説明してください:)。

4

3 に答える 3

31

それだけのはずです。経由でルート ハンドラのセッションにアクセスしますreq.session。セッションは自動的に作成、保存、破棄されます。

ユーザーの新しいセッションを手動で作成する必要がある場合は、 を呼び出しますreq.session.regenerate()

手動で保存する必要がある場合は、 を呼び出すことができますreq.session.save()

手動で破棄する必要がある場合は、 を呼び出すことができますreq.session.destroy()

メソッドとプロパティの完全なリストについては、Connect のドキュメントを参照してください。

于 2012-12-23T20:46:04.657 に答える
11

このコードを検討してください。

var express = require('express');
var redis   = require("redis");
var session = require('express-session');
var redisStore = require('connect-redis')(session);
var bodyParser = require('body-parser');
var client  = redis.createClient();
var app = express();

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));

app.get('/',function(req,res){  
    // create new session object.
    if(req.session.key) {
        // if email key is sent redirect.
        res.redirect('/admin');
    } else {
        // else go to home page.
        res.render('index.html');
    }
});

app.post('/login',function(req,res){
    // when user login set the key to redis.
    req.session.key=req.body.email;
    res.end('done');
});

app.get('/logout',function(req,res){
    req.session.destroy(function(err){
        if(err){
            console.log(err);
        } else {
            res.redirect('/');
        }
    });
});

app.listen(3000,function(){
    console.log("App Started on PORT 3000");
});

したがって、 connect-redisをインストールして、 express-session インスタンスをそれに渡す必要があります。

次に、ミドルウェアで redisStore を次のようなサーバーの詳細で初期化します。

app.use(session({
    secret: 'ssshhhhh',
    // create new redis store.
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl :  260}),
    saveUninitialized: false,
    resave: false
})); 

ttl を 260 に設定しました。増やすことができます。TTL が制限に達すると、redis キーは自動的に削除されます。

ルーターでは、req.session 変数を使用して、セッションを設定、編集、または破棄できます。

もう一つ...

カスタム Cookie が必要な場合、つまり Redis ストアと同じでない場合は、cookie-parserを使用して Cookie シークレットを設定できます。

それが役に立てば幸い。

リンク: https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/

于 2015-07-29T05:43:48.147 に答える