我正在使用passport-twitter在我的网站上设置twitter连接。用户可以通过点击“登录”来连接。或者在'添加新项目'。 2之间的唯一区别是,如果他们点击添加新项目,则一旦他们登录就会打开模态窗口。
要知道他们点击的按钮,我将网址存储在req.session.referrer
:
// route for twitter authentication and login
app.get('/auth/twitter', function(req, res, next){
req.session.referrer = req.url;
console.log(req.session);
passport.authenticate('twitter')(req, res, next);
});
app.get('/auth/twitter/new', function(req, res, next){
req.session.referrer = req.url;
console.log(req.session);
passport.authenticate('twitter')(req, res, next);
});
// handle the callback after twitter has authenticated the user
app.get('/auth/twitter/callback', function(req, res, next){
var options = {
successRedirect : '/twitter-user/signin',
failureRedirect : '/'
};
console.log(req.session);
if (req.session.referrer && req.session.referrer.indexOf('new') > -1) options.successRedirect = '/twitter-user/new';
passport.authenticate('twitter', options)(req, res, next)
});
在我的开发环境中一切正常,但一旦在线,我收到此错误消息: 快速
500 Error: Failed to find request token in session
at Strategy.OAuthStrategy.authenticate (/app/node_modules/passport-twitter/node_modules/passport-oauth1/lib/strategy.js:142:54)
...
我的设置在Twitter中正确设置。这是我得到的日志: 对于请求:
{ cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
passport: {},
referrer: '/auth/twitter' }
对于回调:
{ cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true },
passport: {} }
可能是因为子域问题(http://example.com vs http://www.example.com),因为我没有本地的pb。 我该如何解决这个问题?
非常感谢
编辑:我的API密钥设置如下(根据本教程:http://scotch.io/tutorials/javascript/easy-node-authentication-twitter):
passport.use(new TwitterStrategy({
consumerKey : configAuth.twitterAuth.consumerKey,
consumerSecret : configAuth.twitterAuth.consumerSecret,
callbackURL : configAuth.twitterAuth.callbackURL
},function(token, tokenSecret, profile, done) {
...
});
答案 0 :(得分:1)
我得到了同样的错误,但解决了..这就是我的问题和解决方案。
现状,它不喜欢我的重定向网址“http:// localhost / auth / twitter / callback”。我将其更改为“http:// 127.0.0.1 / auth / twitter / callback”。在我的实际代码中,我必须将其保留为localhost,否则我会收到有关丢失令牌的错误
答案 1 :(得分:0)
首先,如果您的回调为localhost并且您正在使用express-session,请确保cookie安全选项设置为false。例如
// Express session
let sess = {
secret: 'secret',
resave: true,
saveUninitialized: true,
cookie: {
secure: false,
}
}
您还可以通过以下方式更改生产环境
if (process.env.NODE_ENV === 'production') {
app.set('trust proxy', 1) // trust first proxy
sess.cookie.secure = true // serve secure cookies
}
如果这不起作用,请检查是否已将cookie sameSite选项设置为Strict。将其更改为宽松。例如
let sess = {
secret: 'secret',
resave: true,
saveUninitialized: true,
cookie: {
secure: false,
sameSite: 'Lax'
}
}