2017-04-18 112 views
1

我想要完成的是通过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链接触发的?

回答

0

我不确定这是可能的。首先,如果Facebook没有启用CORS,那么你可以做的事情不多(除了使用类似JSONP的东西,但也需要启用)。但更重要的是,我认为他们进行登录的方式不是给你回一个你可以使用的令牌,而是存储一个cookie。为此,他们需要在自己的领域,你不能用Ajax来伪造。最后,我会想象这是他们建立对用户信任的方式的一部分,总是显示相同的登录/授权表单,所以我会认为他们会尽其所能阻止你回避这个问题。

这是所有假设,想法,我没有使用任何的你提到:)

+0

嗯......听起来好像是你知道的事我不知道:)虽然他们实际上做的工具正在回馈一个令牌以用于后续的API请求。另外,令我困惑的是,实际的身份验证过程仅通过服务器发生。在浏览器中发生的唯一事情是启动所述过程(触发'GET/auth/facebook')。在我的理解中,认证的其余部分(相同的登录/认证表单)应该完全相同。但我觉得我在那里失去了一些东西。无论如何,我认为我找到了一个没有AJAX的解决方法:)但是,谢谢! – Flavio

+0

嘿@弗拉维奥,你能分享你的解决方法吗?我的情况非常相似。 – mdeang2