Twitter身份验证,会话不起作用

时间:2017-08-24 15:15:07

标签: node.js session twitter session-cookies twitter-oauth

首先是我的代码:

app.set('views', path.join(__dirname,'app_server', 'views'));
app.engine('ejs', engine);
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));


app.use(cookieParser());
app.use(expressSession({
  secret: 'azerty',
  resave: false,
  saveUninitialized: true,
  cookie: {
    secure: false,
    maxAge: 24*60*60*1000
  }
}))

app.use(bodyParser());
app.use(express.static(path.join(__dirname, 'public')));


app.get('/auth/twitter', function(req, res){
    oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){
        if(error){
            console.log(error);
            res.send(error)
        } else {

            req.session.oauth = {};
            req.session.oauth.token = oauth_token;
            console.log('oauth.token: ' + req.session.oauth.token);
            req.session.oauth.token_secret = oauth_token_secret;
            console.log('oauth.token_secret: ' + req.session.oauth.token_secret);
            res.redirect('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token)
    }
    });
});



app.get('/auth/twitter/callback', function(req, res, next){
    if(req.session.oauth) {
        console.log("Hello world");
    }else {
        console.log("Bad world");
    }
})

当我去路线/auth/twitter时一切正常。 当我从/auth/twitter/callback中的回调中得到响应时,看起来我刚刚存储在会话中的变量就消失了。我的所有会话都是undefined ...

有人有想法吗?我做错什么了吗 ?有更好的方法吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

认为你已经让自己陷入了竞争状态。

您可能会发现Twitter OAuth响应在您当前请求有机会完成之前回复,因此您的会话状态不会及时更新以获得新请求。要修复,请确保在执行重定向之前保存会话,例如

req.session.oauth = {
    token: oauth_token,
    token_secret: oauth_token_secret
};
req.session.save(function(err) {
    if (err) return next(err);

    // redirect
});

resave: false设置将确保会话在这种情况下不会保存两次。