【问题标题】:Passport authentication via ajax通过ajax进行护照认证
【发布时间】:2017-09-14 02:12:51
【问题描述】:

我想要完成的是使用护照通过 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);
});

我发现severalquestions 相似,但似乎都没有一个令人满意的答案。有没有办法真正做到这一点?还是聪明的解决方法?即使路由是使用 html 链接触发的,也许仍然可以发回 JSON 响应?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 嗯...听起来你知道我不知道的事情 :) 尽管他们实际上做的是返回一个令牌以在后续 API 请求中使用。此外,让我感到困惑的是,实际的身份验证过程仅通过服务器发生。浏览器中唯一发生的事情是启动所述过程(触发GET /auth/facebook)。据我了解,其余的身份验证(相同的登录/身份验证表单)应该完全相同。但我觉得我在那里遗漏了一些东西。无论如何,我想我找到了没有 AJAX 的解决方法 :) 但是谢谢!
    • 嘿@Flavio,你能分享你的解决方法吗?我的情况非常相似。
    • 我只是按照它应该工作的方式来做,带有<a href="/auth/facebook"> 标签。然后在成功认证后我重定向回“/”。然后在浏览器中,我通过 Ajax 检查用户是否已登录并相应地进行路由……感觉有点 hacky,但可以完成工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 2015-09-23
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多