Passport.js – 浏览器GET请求是好的,但来自JS代码的AJAX请求不是?

我已经在Node.js服务器上configuration了Passport,并主要使用Twitter身份validation策略。

我最近发现一个似乎表明使用浏览器URL(使用Web浏览器search栏)的GET请求似乎与来自应用程序代码内部的AJAX请求不同的身份validation,这让我感到困惑。 例如,如果我使用Passportlogin,则可以通过将浏览器指向直接向后端服务器发送请求的某些URL来访问所有内容。 但是,Angular或jQuery对后端API的任何请求似乎都是未经授权的。

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

默认情况下,跨源XHR请求不会包含Cookie(通常用于维护需要身份validation的应用程序中的状态)。

您可以通过使用Credentials进行设置来更改:

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

您可能需要调整服务器上的CORS规则,以表示Access-Control-Allow-Credentials: true

另见MDN 。

Twitterauthentication策略要求用户login到Twitter,并允许您的“应用”权限访问您的Twitter帐户信息。 这不能用XHR来完成,因为如果用户尚未login,用户如何input他们的Twitter凭证loginTwitter呢? 如果请求是通过XHR发送的,用户将如何批准您的Twitter“应用程序”请求的权限?

这适用于所有使用OAuth或OpenID的Passport策略。 用户的浏览器必须直接进入auth提供商的网站,以便他们可以:A)login到auth提供商或B)批准您在您的应用程序中请求的权限。 一旦用户完成了validation提供程序(在您的情况下,Twitter),然后将用户的浏览器redirect到您的应用程序的端点与某种forms的令牌,然后您的应用程序将用于从validation提供程序请求信息(如电子邮件地址,全名等)