node.js - 通过 ajax 进行 Passport 身份验证

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

我想要完成的是使用 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/

相关文章:

node.js - PyCharm 无法识别 Require 和 module 语句

javascript - 在下拉列表中显示来自 mysql 表的数据

javascript - 重新加载后比较数据表的数据,如果数据未更改,则以红色突出显示行

javascript - Express:将参数分配给 app.use() 的不同方法

node.js - 通过 mongodb 保存表单部分

javascript - 根据用户输入从 api(RESTful) db(mongodb) 获取数据

node.js - 如何使用带有 node.js 的 strip 连接支付网关?

node.js - 如何让 updatemany 验证每个修改文档的 Mongoose 模式?

node.js - Express - 多个角度应用程序

jquery - 在 jQuery 中执行未知数量的 Ajax 请求