0

我正在尝试在使用 Redis 进行 Express 会话的应用程序中使用 passport-twitter 和 passport-facebook 进行身份验证。如果我删除了用于以 express 存储会话的 connect-redis,一切正常,但是使用 Redis 会话,我收到以下错误:

Error: OAuth authentication requires session support
| at Strategy.OAuthStrategy.authenticate

我的代码如下:

app.configure(function(){
app.set('port', process.env.PORT || port);
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser("supersecret"));
app.use('/html', express.static('html'));
app.use('/assets', express.static('assets'));
});

if (process.env.REDISCLOUD_URL) {
var rtg = require("url").parse(process.env.REDISCLOUD_URL),
    redis = require('redis'),
    connectRedisStore = require('connect-redis')(express),
    authToken = rtg.auth.split(":")[1];

app.configure(function(){
    app.use(
        express.session(
            {
                secret: 'supersecret',
                cookie: { maxAge: 60000 },
                store: new connectRedisStore({
                    host: rtg.hostname,
                    port: rtg.port,
                    db: authToken[0],
                    pass: authToken[1]
                })
            }
        )
    );

    app.use(passport.initialize());
    app.use(passport.session(
        {
            secret: 'supersecret',
            store: new connectRedisStore({
                host: rtg.hostname,
                port: rtg.port,
                db: authToken[0],
                pass: authToken[1]
            })
        }
    ));
});
}

可以一起使用这些吗?

编辑: 在进一步调试中,似乎将 connect-redis 用于快速会话存储并没有将 req.session 设置为任何内容。这就是导致问题的原因。不幸的是,我似乎根本无法让它工作。其他有同样问题的人通过将 cookieParser 行放在会话行上方来修复它,但这就是它一直在我的地方,所以问题是别的。我很茫然。

4

1 回答 1

4

好的,经过两天的搜索和浏览所有涉及的 node_modules 的源代码(express、connect、connect-redis),我将我的问题归结为一个简单的愚蠢的错字。

authToken = rtg.auth.split(":")[1];

这里的 authToken 只是提供密码(这是 redis 用来连接的所有内容)。但是要手动选择数据库,您需要删除 [1] 并将第一个元素作为数据库名称传入,第二个元素作为 pass。希望它可以帮助其他人!

于 2013-05-14T22:28:15.137 回答