我发现这个:How to passing data in TwitterStrategy, PassportJS?这非常有帮助,但我认为它使用旧版护照或快递,或两者兼而有之:
我的下面的代码没有错误,但是passport.authenticate('twitter')似乎没有被调用。我知道我的TwitterStrategy工作,所以我不认为是这样,它认为我可能需要在某处做一个res.send(),以便ajax请求获得成功?任何帮助,将不胜感激!提前谢谢!
var states={};
router.get('/auth/twitter', function(req, res, next){
var reqId = 'req'+req.sessionID
states[reqId] = {
turkeyName : req.query.turkeyName,
charityName : req.query.charityName,
votes : req.query.votes
};
req.session.state = reqId
next();
}, function(req, res, next) {
passport.authenticate('twitter');
});
这就是我在客户端上所做的事情
var params = {
turkeyName: $('#turkeyNameInput').val(),
charityName: 'Stand up to Cancer',
votes: 1
};
var auth = $.ajax({
type: 'GET',
url: '/auth/twitter',
data: params,
dataType: 'text',
async: true
});
auth.success(function(data){
console.log('$ajax.auth -- success');
console.log(data);
});
auth.error(function(err){
console.log('$ajax.auth -- error');
console.log(err);
});
答案 0 :(得分:0)
好的,对于有此问题的其他人也是如此。
在我的noob方式中,我使用ajax从客户端向服务器路由发出get请求...但是在我的服务器进行了相关的护照呼叫后,我遇到了一些Access-Control-Allow-Origin错误。
这是因为Twitter通过ajax阻止来自客户端的请求。 如果您正在获取Access-Control-Allow-Origin或类似的ditch ajax并使用window.location.href
路线:
var states={};
router.get('/auth/twitter', function(req, res, next){
var reqId = 'req'+req.sessionID
states[reqId] = {
turkeyName : req.query.turkeyName,
charityName : req.query.charityName,
votes : req.query.votes
};
req.session.state = reqId
next();
}, passport.authenticate('twitter'),function(req, res) {
});
回调:
router.get("/auth/twitter/callback",
passport.authenticate('twitter'), function(req, res) {
var reqId = req.session.state;
var state = states[reqId]
findOrCreate(userInfo.userInfoModel, {userInfo : req.user, turkeyName : state.turkeyName, charityName : state.charityName, votes : state.votes}, function(err, userDataRes){
if(err){
req.session.destroy();
}else{
res.redirect('/list');
}
});
});
客户端:
var url = '/auth/twitter?'
var dataObj = {
turkeyName: $('#turkeyNameInput').val(),
charityName: 'name of charity',
votes: 1
};
window.location.href = url + $.param(dataObj);