我在Node.js服务器上配置了Passport,并且主要使用Twitter身份验证策略。
我对最近的一项发现感到困惑,该发现似乎表明带有浏览器URL的GET请求(使用Web浏览器搜索栏)似乎与应用程序代码中的AJAX请求的身份验证不同。例如,如果我使用Passport登录,我可以通过将浏览器指向某些直接向后端服务器发出请求的URL来访问所有内容。但Angular或jQuery对后端API的任何请求似乎都是未经授权的。
这可能完全正确吗?如果是这样,Passport如何知道浏览器请求和JS代码中的AJAX请求之间的区别?
答案 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提供者请求信息(例如电子邮件地址,全名等。)