首先这是我的代码:
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
...
有人有想法吗?我做错了什么吗?有没有更好的方法可以做?
多谢!
我认为你有一个竞争条件。
您可能会发现 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
设置将确保会话在这种情况下不会保存两次。