【问题标题】:Passport.js - browser GET requests are OK, but AJAX requests from JS code are not?Passport.js - 浏览器 GET 请求可以,但是来自 JS 代码的 AJAX 请求不行吗?
【发布时间】:2016-02-18 10:36:30
【问题描述】:

我在 Node.js 服务器上配置了 Passport,主要使用 Twitter 身份验证策略。

我对最近的一项发现感到困惑,该发现似乎表明带有浏览器 URL(使用 Web 浏览器搜索栏)的 GET 请求的身份验证方式似乎与来自应用程序代码内部的 AJAX 请求不同。例如,如果我使用 Passport 登录,我可以通过将浏览器指向直接向后端服务器发出请求的某些 url 来访问所有内容。但是 Angular 或 jQuery 对后端 API 的任何请求似乎都是未经授权的。

这完全正确吗?如果是这样,Passport 如何从 JS 代码中知道浏览器请求和 AJAX 请求之间的区别?

【问题讨论】:

  • (1) 您可以判断请求是否为 XHR (AJAX) 请求。 (2) 也许这只是没有正确的cookies的问题; Angular 或 jQuery 代码与 Node.js 服务器位于完全相同的主机名中吗?
  • 这可能是错误的编码,或者是您的代码中的简单遗漏。当然没有办法知道
  • 是的 - Angular 代码由与 API 服务器不同的服务器提供服务
  • 听起来不错。很高兴你找到了解决方案。 :)

标签: javascript ajax node.js passport.js


【解决方案1】:

默认情况下,跨域 XHR 请求不包含 cookie(通常用于在需要身份验证的应用程序中维护状态)。

你可以通过设置withCredentials来改变它:

var xhr = new XMLHttpRequest();
xhr.open(...);
xhr.withCredentials = true;

您可能需要将服务器上的 CORS 规则调整为 Access-Control-Allow-Credentials: true

另见MDN

【讨论】:

  • 这似乎可以解决问题。我可以通过使用 $httpProvider.defaults 来使用 Angular 做到这一点。
  • 感谢昆汀,我给了你 150 分 - 但是,一个新问题,你的解决方案适用于 HTTP,但不确定它是否适用于 HTTPS。您是否知道 HTTPS 是否禁止使用带有 XHR 的凭据或需要额外的步骤?
  • 据我所知,但从通过 HTTP 加载的页面向 HTTPS 发出请求(反之亦然)可能会被完全阻止,因为这样做提供了启动中间人的绝佳机会攻击其他安全数据。
【解决方案2】:

Twitter 身份验证策略要求用户登录 Twitter,并允许您的“应用”权限访问您的 Twitter 帐户信息。这不能通过 XHR 完成,因为如果用户尚未登录,用户将如何输入他们的 Twitter 凭据来登录 Twitter?如果请求是通过 XHR 发送的,用户将如何批准您的 Twitter“应用”请求的权限?

这适用于所有使用 OAuth 或 OpenID 的 Passport 策略。用户的浏览器必须直接访问身份验证提供程序的站点,以便他们可以 A) 登录身份验证提供程序或 B) 批准您在应用程序中请求的权限。一旦用户完成了该操作,身份验证提供程序(在您的情况下为 Twitter)将使用某种令牌将用户的浏览器重定向回您的应用程序的端点,然后您的应用程序将使用该令牌从身份验证提供程序请求信息(例如电子邮件地址,全名等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2018-01-18
    • 2012-04-14
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多