【问题标题】:Share sessions with redis and passport on a subdomain?在子域上与 redis 和护照共享会话?
【发布时间】:2015-04-24 09:45:04
【问题描述】:

我正在使用 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 时,他/她已经永久登录,而无需登录两次?

【问题讨论】:

    标签: node.js session redis passport.js


    【解决方案1】:

    您需要以下模块。

    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

    【讨论】:

    • 哇,谢谢,这很有帮助,我很感激。让我实现它然后我会检查这个!
    • 当我尝试登录时它不会执行护照,它只是做一个 POST 并且没有任何反应?
    • 我现在可以登录了,但是会话没有共享??
    【解决方案2】:

    我是这样做的,这是最重要的部分 - 域:.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
      }
    })
    

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多