我想要完成的是通过ajax使用护照进行用户认证。推荐使用护照的方式是通过GET
请求触发授权过程,该请求使用常规的<a>
标签触发。成功(或失败)身份验证后,将重定向到新页面。现在,而不是使用HTML链接来触发我想通过ajax做的路线。这里的问题是,当我尝试这与第三方身份验证策略,如passport-facebook
我得到一个CORS错误:通过ajax的护照认证
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但没有人似乎有一个令人满意的答案。有没有办法实际做到这一点?或者一个聪明的解决方法?也许一种方式仍然发回JSON响应,即使路由是使用HTML链接触发的?
嗯......听起来好像是你知道的事我不知道:)虽然他们实际上做的工具正在回馈一个令牌以用于后续的API请求。另外,令我困惑的是,实际的身份验证过程仅通过服务器发生。在浏览器中发生的唯一事情是启动所述过程(触发'GET/auth/facebook')。在我的理解中,认证的其余部分(相同的登录/认证表单)应该完全相同。但我觉得我在那里失去了一些东西。无论如何,我认为我找到了一个没有AJAX的解决方法:)但是,谢谢! – Flavio
嘿@弗拉维奥,你能分享你的解决方法吗?我的情况非常相似。 – mdeang2
我只是用它的工作方式,用一个'''标签。然后,成功验证后,我重定向回到“/”。然后在浏览器中,我通过Ajax检查用户是否已登录,并据此进行路由......感觉有点冒失,但完成了这项工作。 – Flavio