【发布时间】:2017-06-19 13:22:51
【问题描述】:
我正在尝试在我的 Nodejs/Angular/Express/Passport 应用程序中通过 Facebook 实现 OAUTH 登录,但我正在为此苦苦挣扎。
我仍然收到 CORS 错误:
XMLHttpRequest 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'https://www.xxxxxx.net'。
虽然我已经添加到我的 EXPRESS ROUTER:
router.all('/*', function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
if ('OPTIONS' === req.method) {
res.send(200);
}
else {
next();
}
});
在开发者控制台中,我可以看到“oauth/facebook”GET 调用的标头正在添加“Access-Control-Allow-Origin”等等。
在回调中没有“Access-Control-Allow-Origin”等 - 这是正确的吗?
router.get('/oauth/facebook/',passport.authenticate('facebook',{
failureRedirect: '/info',
scope:['email']
}));
router.get('/oauth/facebook/callback/', passport.authenticate('facebook',{
failureRedirect: '/info',
successRedirect: '/',
scope:['email']
}),
function(req,res){
if(req.user){
return res.json({token: req.user.generateJWT()});
} else {
return res.status(400).json({message:"Not found"});
}
});
【问题讨论】:
-
我认为访问令牌是通过标头
Authorization发送的;所以你也应该在标头中提供它:res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type');通常对于成功的请求,请始终考虑提供这些标头:res.header('Access-Control-Allow-Headers', 'Authorization, Origin, X-Requested-With, Content-Type, Accept'); -
感谢您的回答 - 但仍然是同样的错误:/
-
您无法通过 AJAX 加载 FB 登录对话框。您需要直接在顶部窗口实例中调用它(原因很明显,用户需要能够通过地址栏验证他们确实在登录 Facebook,而不是某些钓鱼网站。)
-
但是我需要从服务器端调用它,因为我还需要生成JWT进行登录授权
标签: javascript node.js facebook express passport.js