我想要完成的是使用护照通过ajax进行用户身份验证。建议使用通行证的方法是通过GET
请求触发授权过程,该请求使用常规<a>
标记触发。成功(或失败)身份验证后,会重定向到新页面。现在,而不是使用HTML链接来触发我想通过ajax做的路由。这里的问题是,当我使用第三方身份验证策略(例如passport-facebook
)尝试此操作时,我收到了CORS错误:
XMLHttpRequest cannot load [the facebook auth URL]' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8080' is therefore not allowed access.
以下是相关的服务器端代码:
// route for facebook authentication and login
app.get('/auth/facebook', passport.authenticate('facebook', { scope : ['email'] }));
// handle the callback after facebook has authenticated the user
app.get('/auth/facebook/callback', (req, res, next) => {
passport.authenticate('facebook', (err, user, info) => {
req.login(user, function(err) {
if(err) return next(err);
return res.status(200).json({
success: "All good man!"
});
})
})(req, res, next);
});
在浏览器中我只是这样做:
axios.get('/auth/facebook').then((response) => {
console.log(response);
});
我发现several类似questions,但似乎没有一个人有满意的答案。有没有办法真正做到这一点?还是一个聪明的解决方法?即使路由是使用html链接触发的,也许仍然可以发送回JSON响应的方法吗?
答案 0 :(得分:0)
我不确定这是可能的。首先,如果Facebook没有启用CORS,那么你可以做的就不多了(除了使用像JSONP这样的东西,但也需要启用它)。但更重要的是,我认为他们登录的方式不是给你一个你可以使用的令牌,而是存储一个cookie。为此,他们需要在自己的域上,你不能用Ajax伪造它。最后,我认为这是他们与用户建立信任的方式的一部分,总是显示相同的登录/授权表单,所以我认为他们会尽一切可能阻止你绕过这个。
这都是假设的,记住,我没有使用你提到的任何工具:)