Passport.js - 浏览器 GET 请求可以,但是来自 JS 代码的 AJAX 请求不行?
Passport.js - browser GET requests are OK, but AJAX requests from JS code are not?
我在 Node.js 服务器上配置了 Passport,主要使用 Twitter 身份验证策略。
我对最近的一项发现感到困惑,该发现似乎表明使用浏览器 URL 的 GET 请求(使用网络浏览器搜索栏)似乎与来自内部的 AJAX 请求的验证方式不同应用程序代码。例如,如果我使用 Passport 登录,我可以通过将浏览器指向某些直接向后端服务器发出请求的 url 来访问所有内容。但是 Angular 或 jQuery 对后端 API 的任何请求似乎都是未经授权的。
这完全正确吗?如果是这样,Passport 如何知道浏览器请求和来自 JS 代码内部的 AJAX 请求之间的区别?
默认情况下,跨源 XHR 请求不会包含 cookie(通常用于在需要身份验证的应用程序中维护状态)。
您可以通过设置 withCredentials:
来更改它
var xhr = new XMLHttpRequest();
xhr.open(...);
xhr.withCredentials = true;
您可能需要将服务器上的 CORS 规则调整为 Access-Control-Allow-Credentials: true
。
另见 MDN。
Twitter 身份验证策略要求用户登录 Twitter 并允许您 "app" 访问您的 Twitter 帐户信息的权限。这不能用 XHR 完成,因为如果用户尚未登录,用户将如何输入他们的 Twitter 凭据以登录 Twitter?如果请求是通过 XHR 发送的,用户将如何批准你的 Twitter "app" 请求的权限?
这适用于所有使用 OAuth 或 OpenID 的 Passport 策略。用户的浏览器必须直接转到身份验证提供者的站点,以便他们可以 A) 登录到身份验证提供者或 B) 批准您在应用程序中请求的权限。用户完成后,身份验证提供程序(在您的情况下是 Twitter)将使用某种令牌将用户的浏览器重定向回您的应用程序的端点,然后您的应用程序将使用该令牌从身份验证提供程序请求信息(例如电子邮件地址,全名等)
我在 Node.js 服务器上配置了 Passport,主要使用 Twitter 身份验证策略。
我对最近的一项发现感到困惑,该发现似乎表明使用浏览器 URL 的 GET 请求(使用网络浏览器搜索栏)似乎与来自内部的 AJAX 请求的验证方式不同应用程序代码。例如,如果我使用 Passport 登录,我可以通过将浏览器指向某些直接向后端服务器发出请求的 url 来访问所有内容。但是 Angular 或 jQuery 对后端 API 的任何请求似乎都是未经授权的。
这完全正确吗?如果是这样,Passport 如何知道浏览器请求和来自 JS 代码内部的 AJAX 请求之间的区别?
默认情况下,跨源 XHR 请求不会包含 cookie(通常用于在需要身份验证的应用程序中维护状态)。
您可以通过设置 withCredentials:
来更改它var xhr = new XMLHttpRequest();
xhr.open(...);
xhr.withCredentials = true;
您可能需要将服务器上的 CORS 规则调整为 Access-Control-Allow-Credentials: true
。
另见 MDN。
Twitter 身份验证策略要求用户登录 Twitter 并允许您 "app" 访问您的 Twitter 帐户信息的权限。这不能用 XHR 完成,因为如果用户尚未登录,用户将如何输入他们的 Twitter 凭据以登录 Twitter?如果请求是通过 XHR 发送的,用户将如何批准你的 Twitter "app" 请求的权限?
这适用于所有使用 OAuth 或 OpenID 的 Passport 策略。用户的浏览器必须直接转到身份验证提供者的站点,以便他们可以 A) 登录到身份验证提供者或 B) 批准您在应用程序中请求的权限。用户完成后,身份验证提供程序(在您的情况下是 Twitter)将使用某种令牌将用户的浏览器重定向回您的应用程序的端点,然后您的应用程序将使用该令牌从身份验证提供程序请求信息(例如电子邮件地址,全名等)