Passport.js - 浏览器GET请求没问题,但JS代码的AJAX请求不是吗?

时间:2015-11-17 06:26:12

标签: javascript ajax node.js passport.js

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

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

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

2 个答案:

答案 0 :(得分:4)

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

您可以通过设置withCredentials

来更改它
var xhr = new XMLHttpRequest();
xhr.open(...);
xhr.withCredentials = true;

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

另见MDN

答案 1 :(得分:1)

Twitter身份验证策略要求用户登录Twitter并允许您的“应用”权限访问您的Twitter帐户信息。使用XHR无法做到这一点,因为如果用户尚未登录,用户如何输入他们的Twitter凭据登录Twitter?如果请求是通过XHR发送的,用户如何批准您的“app”请求的权限?

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