通过ajax进行Passport身份验证

时间:2017-04-18 09:45:29

标签: node.js ajax express passport.js passport-facebook

我想要完成的是使用护照通过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响应的方法吗?

1 个答案:

答案 0 :(得分:0)

我不确定这是可能的。首先,如果Facebook没有启用CORS,那么你可以做的就不多了(除了使用像JSONP这样的东西,但也需要启用它)。但更重要的是,我认为他们登录的方式不是给你一个你可以使用的令牌,而是存储一个cookie。为此,他们需要在自己的域上,你不能用Ajax伪造它。最后,我认为这是他们与用户建立信任的方式的一部分,总是显示相同的登录/授权表单,所以我认为他们会尽一切可能阻止你绕过这个。

这都是假设的,记住,我没有使用你提到的任何工具:)

相关问题