在子域上与redis和护照共享会话?

时间:2015-02-23 05:41:32

标签: node.js session redis passport.js

我正在使用npm子域名,在我的应用程序中,我有伪造子域名的路由

// looks like app.localhost:3000
router.get('/subdomain/app', app.dashboard);

所以我在子域上有一个登录页面,在非子域页面上有一个登录页面。他们不分享会话,所以我必须登录两次。我想设置redis,但我不知道如何。

// here is my session middleware, I tried using .localhost
app.use(session({ secret: 'something', domain: '.localhost', }));

我已经看到人们使用redis的地方

app.use(express.session({
    store:new RedisStore({
        host: config.redis.session.host,
        port: config.redis.session.port,
        db: config.redis.session.db
    }),
    secret: config.session_secret
}));

这似乎可以解决我的问题,但我不知道如何设置redisStore以及配置数据来自哪里?

有人可以向我解释如何使用redis,以便当用户登录app.example.io或example.io时他/她已登录好,无需登录两次吗?

2 个答案:

答案 0 :(得分:0)

您需要以下模块。

connect-redis
express-session
cookie-parser

然后使用以下示例代码:

var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var RedisStore = require('connect-redis')(session);

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

app.get('/', function (req, res) {
  res.send('Hello World!')
})

var server = app.listen(3000, function () {
  var host = server.address().address
  var port = server.address().port
  console.log('Example app listening at http://%s:%s', host, port)
})

来源:How to save and retrieve session from Redis

答案 1 :(得分:0)

这是我的操作方式,这是最重要的部分-域: .yourdomain.io 请确保在域之前使用该点。

var express = require('express'),
  app = express(),
  cookieParser = require('cookie-parser'),
  bodyParser = require('body-parser'),
  expressSession = require('express-session'),
  sessionMiddleware = null,
  redis = require('redis'),
  conn_redis = {
    path: '/var/run/redis/redis.sock',
    socket_keepalive: true
  }
app.use(cookieParser())
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({
  extended: true
}))
const connectRedis = require('connect-redis')(expressSession),
  uid = require('uid-safe').sync
sessionMiddleware = expressSession({
  store: new connectRedis(conn_redis),
  secret: 'xxxxxxxxxxxxxxxxxxxxx',
  name: 'session_name',
  resave: false,
  rolling: true,
  saveUninitialized: false,    
  logErrors: true,
  cookie: {
    path: '/',
    domain: '.yourdomain.io'
    expires: new Date(Date.now() + 3600000),
    maxAge: 3600000
  }
})