Node.jsで記述された認証システムにRedisセッションを統合しようとしています。
Redisサーバーを正常にセットアップできました。connect-redis
および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に関する多くの質問がありますが、それぞれの設定だけで停止し、実際に使用する方法については説明しません。
これはおそらく非常に単純であることを承知していますが、降格せずに説明してください:)。
これですべてです。ルートハンドラーのセッションには、_req.session
_を介してアクセスします。セッションは自動的に作成、保存、および破棄されます。
ユーザーの新しいセッションを手動で作成する必要がある場合は、req.session.regenerate()
を呼び出します。
手動で保存する必要がある場合は、req.session.save()
を呼び出すことができます。
手動で破棄する必要がある場合は、req.session.destroy()
を呼び出すことができます。
メソッドとプロパティの完全なリストについては、 Connectのドキュメント を参照してください。
このコードを検討してください。
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変数を使用して、セッションを設定、編集、または破棄できます。
もう一つ...
Redisストアとは異なるカスタムCookieが必要な場合は、cookie-parserを使用してCookieシークレットを設定できます。
それが役に立てば幸い。
リンク: https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/
また、Redisモニターツールを使用して、すべてのアクションをリアルタイムで確認することもできます!アプリを更新すると、コンソールウィンドウにデータが表示されます。
redis-cli monitor
Tj/connect-redisを使用したセッションのサンプル出力
1538704759.924701 [0 unix:/tmp/redis.sock] "expire" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh" "3600"
1538704759.131285 [0 unix:/tmp/redis.sock] "get" "sess:F9x-YgbgXu1g7RG8tFlkwY3RV0JzHgCh"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"Zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"
1538704787.179318 [0 unix:/tmp/redis.sock] "set" "sess:Hl3LPbOBdKO44SG4zQHFn2gfdiWTwzWW" "{\"cookie\":{\"originalMaxAge\":3600000,\"expires\":\"2018-10-05T02:59:47.178Z\",\"secure\":true,\"httpOnly\":true,\"domain\":\".indospace.io\",\"path\":\"/\"},\"path\":\"/\",\"userAgent\":{\"family\":\"NewRelicPingerBot\",\"major\":\"1\",\"minor\":\"0\",\"patch\":\"0\",\"device\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"},\"os\":{\"family\":\"Other\",\"major\":\"0\",\"minor\":\"0\",\"patch\":\"0\"}},\"ip\":\"184.73.237.85\",\"page_not_found_count\":0,\"city\":\"Ashburn\",\"state\":\"VA\",\"city_state\":\"Ashburn, VA\",\"Zip\":\"20149\",\"latitude\":39.0481,\"longitude\":-77.4728,\"country\":\"US\"}" "EX" "3599"