Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Passport.js-浏览器GET请求可以,但是来自js代码的AJAX请求不行吗?_Javascript_Ajax_Node.js_Passport.js - Fatal编程技术网

Javascript Passport.js-浏览器GET请求可以,但是来自js代码的AJAX请求不行吗?

Javascript Passport.js-浏览器GET请求可以,但是来自js代码的AJAX请求不行吗?,javascript,ajax,node.js,passport.js,Javascript,Ajax,Node.js,Passport.js,我已经在Node.js服务器上配置了Passport,并且主要使用Twitter身份验证策略 我对最近的一个发现感到困惑,该发现似乎表明带有浏览器URL的GET请求(使用web浏览器搜索栏)的身份验证似乎与应用程序代码内部的AJAX请求不同。例如,如果我使用Passport登录,我可以通过将浏览器指向直接向后端服务器发出请求的特定URL来访问所有内容。但是Angular或jQuery对后端API的任何请求似乎都是未经授权的 这完全正确吗?如果是这样,Passport如何从JS代码内部知道浏览器请

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

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


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

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

您可以通过设置:

您可能需要调整服务器上的CORS规则,说
访问控制允许凭据:true


另请参见。

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


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

(1)您可以判断请求是否为XHR(AJAX)请求。(2) 也许这只是一个没有正确的饼干的问题;Angular或jQuery代码与Node.js服务器的主机名是否完全相同?请注意,这可能是编码不正确,或者是代码中的一个简单遗漏。当然,没有办法知道是的-angular代码是由不同的服务器提供的,而API服务器听起来是正确的。很高兴你找到了解决办法。:)这似乎奏效了。通过使用$httpProvider.defaults,我可以用Angular实现这一点。感谢Quentin,我给了你150分——不过,有一个新问题,你的解决方案适用于HTTP,但不确定它是否适用于HTTPS。您知道HTTPS是否禁止使用XHR凭据,或者需要额外的步骤吗?据我所知,不知道,但是从通过HTTP加载的页面请求HTTPS,或者从HTTP加载的页面请求HTTPS,或者从HTTP加载的页面请求HTTPS,可能会被完全阻止,因为这样做很有可能对其他安全数据发起中间人攻击。
var xhr = new XMLHttpRequest();
xhr.open(...);
xhr.withCredentials = true;