我想要完成的是使用 Passport 通过 ajax 进行用户身份验证。推荐使用 Passport 的方式是通过 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 响应的方法?
最佳答案
我不确定这是否可行。首先,如果 Facebook 不启用 CORS,那么您对此无能为力(除了使用 JSONP 之类的东西,但也需要启用)。但更重要的是,我认为他们登录的方式不是给你一个你可以使用的 token ,而是存储一个 cookie。为此,他们需要在自己的域中,而你不能用 Ajax 来伪造它。最后,我想这是他们与用户建立信任的方式的一部分,始终显示相同的登录/授权表单,所以我认为他们会尽一切努力阻止您绕过这个问题。
请注意,这都是假设,我没有使用过您提到的任何工具:)
关于node.js - 通过 ajax 进行 Passport 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43468777/