Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Angular 如果不允许使用CORS通配符进行身份验证,如何促进跨源身份验证?_Angular_Mongodb_Express_Cors - Fatal编程技术网

Angular 如果不允许使用CORS通配符进行身份验证,如何促进跨源身份验证?

Angular 如果不允许使用CORS通配符进行身份验证,如何促进跨源身份验证?,angular,mongodb,express,cors,Angular,Mongodb,Express,Cors,救命啊!帮助我收到一个与AJAX HttpClient请求相关的CORS错误,该请求试图接收res.cookie作为响应 作为背景: 我的CORS政策 app.use(cors()); app.options('*',cors()); var allowCrossDomain = function(req,res,next) { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow

救命啊!帮助我收到一个与AJAX HttpClient请求相关的CORS错误,该请求试图接收res.cookie作为响应

作为背景:

我的CORS政策

app.use(cors());
app.options('*',cors());
var allowCrossDomain = function(req,res,next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();  
}
app.use(allowCrossDomain);

app.use(csp({
  policies: {
      'default-src': [csp.NONE ],
      'img-src': [csp.SELF] }
}));
来自本地主机的请求:4200

// Template
<form #f="ngForm" [formGroup]="userForm" (ngSubmit)="doSignUp(f)">
   . . . 
   . . . 
    <button>Submit</button>
</form>


//Sign-up Component
doSignUp(f: NgForm) {
  this.member.postSignupForm(f).subscribe((res)=>console.log(`RES: ${JSON.stringify(res)}`));
}


// Auth Service 
postSignupForm(f: NgForm): Observable<any> {
    return this.http.post(this.signup_url, f.value);
}

错误:

已阻止跨源请求:同一源策略不允许读取位于的远程资源。原因:CORS请求未成功

我在维基百科上看到了以下内容:

通配符同源策略在对象功能模型中也得到了广泛而适当的使用,在对象功能模型中,页面具有不可使用的URL,任何知道秘密的人都可以访问

*的值很特别,因为它不允许请求提供凭据,这意味着它不允许在跨域请求中发送HTTP身份验证、客户端SSL证书或cookie

前一句话让我很困惑!如果无法使用*提供凭据,如何配置CORS以允许跨源进行HTTP身份验证

我还注意到以下明显相关的问题,这个问题已经悬而未决好几个月了,还没有得到回答

那么,如果Wikipedia是正确的,那么如何允许跨源AJAX请求在响应中返回cookie,例如包含用于身份验证的JWT?我一定是漏掉了什么或者读错了,但是如果你不能在访问控制中使用*Allow Origin,但是你想有一个开放的API,你如何认证来自随机域的人?显然,你不能预先知道所有访问你的开放网站的域名

谢谢大家!

===================================

更新:根据下面两个答案的建议,我做了如下更改:

res.header'Access-Control-Allow-Origin',req.headers.Origin | |'*; res.header'Access-Control-Allow-Headers','Content Type,Authorization,Origin,Accept'

我现在得到一个服务器端重复密钥错误:

MongoError:E11000重复密钥错误集合:UserDB.users索引:authData.username.value_1 dup密钥:{:michael}

我仍然得到一个CORS错误,但我认为现在CORS错误可能是由服务器有一个异常这一事实引起的。我发现,当服务器出现异常时,它通常会反映在客户端CORS中。或者服务器是否有异常,因为客户端由于CORS错误而无法正确接收响应

**问题是,我认为我得到了重复密钥错误,因为出于某种原因我无法理解,服务器试图保存同一文档两次。MONGO中的文档正在正确更新,但服务器会再次尝试保存同一文档。在客户端,只有一个POST请求**

这种双重保存行为是否与客户机因为CORS而不接受来自服务器的响应有关?即,**是CORS导致DUP密钥错误,还是DUP密钥错误导致CORS错误?服务器试图保存同一个文档两次的原因是什么?**

前一句话让我很困惑!如果无法使用*提供凭据,如何配置CORS以允许跨源进行HTTP身份验证

服务器可以选择使用特定的Access Control Allow Origin response标头进行响应,该标头与请求中的源标头相匹配

例如,假设客户端请求:

GET /resource HTTP/1.1
Origin: origin-a.example.com
服务器可以响应:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: origin-a.example.com
在Node.js示例中,尝试以下操作:

res.header('Access-Control-Allow-Origin', req.headers.origin || '*');
前一句话让我很困惑!如果无法使用*提供凭据,如何配置CORS以允许跨源进行HTTP身份验证

服务器可以选择使用特定的Access Control Allow Origin response标头进行响应,该标头与请求中的源标头相匹配

例如,假设客户端请求:

GET /resource HTTP/1.1
Origin: origin-a.example.com
服务器可以响应:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: origin-a.example.com
在Node.js示例中,尝试以下操作:

res.header('Access-Control-Allow-Origin', req.headers.origin || '*');

通常,对于支持跨源请求的NodeJ,需要显式指定方法和头。例如,需要指定诸如授权、来源和接受等标题

另一点需要注意的是,当浏览器向服务器发送跨源请求时,它主要发送选项请求以检查目标资源的通信选项。这需要处理

你可以用这样的东西


希望这能澄清您的担忧。

通常对于支持跨源请求的NodeJ,您需要明确指定方法和头。例如,需要指定诸如授权、来源和接受等标题

另一点需要注意的是,当浏览器向服务器发送跨源请求时,它主要发送OPTIONS请求以检查tar的通信选项 获取资源。这需要处理

你可以用这样的东西


希望这能澄清您的担忧。

非常感谢。这非常有帮助,我觉得这让我走上了正确的道路。然而,不幸的是,在做出更改后,您建议res.header'Access-Control-Allow-Origin',req.headers.Origin | |*'我仍然得到CORS错误。根据控制台,我注意到req.headers.origin是。源是http而主机是https这一事实是否会有问题?或者,如果这不是一个问题,还有其他关于如何进一步调试的想法吗?我对OP做了一些更新。请参见上面,谢谢!。非常感谢。这非常有帮助,我觉得这让我走上了正确的道路。然而,不幸的是,在做出更改后,您建议res.header'Access-Control-Allow-Origin',req.headers.Origin | |*'我仍然得到CORS错误。根据控制台,我注意到req.headers.origin是。源是http而主机是https这一事实是否会有问题?或者,如果这不是一个问题,还有其他关于如何进一步调试的想法吗?我对OP做了一些更新。请参见上面,谢谢!。非常感谢。这很有帮助。根据您的建议,我添加了res.setHeader访问控制允许标题、内容类型、授权、来源、接受;这似乎在某种程度上有所帮助,但我仍然得到了一个错误,尽管现在略有不同。我如上所述修改了我的OP。非常感谢,如果你能查看更新,看看你是否能想出任何进一步的建议@CrowdPleaser您是否查看了数据库。我想钥匙有一把复制的。这可能就是这个例外的原因。如您提供的错误所示,用户名似乎有重复项。非常感谢。这很有帮助。根据您的建议,我添加了res.setHeader访问控制允许标题、内容类型、授权、来源、接受;这似乎在某种程度上有所帮助,但我仍然得到了一个错误,尽管现在略有不同。我如上所述修改了我的OP。非常感谢,如果你能查看更新,看看你是否能想出任何进一步的建议@CrowdPleaser您是否查看了数据库。我想钥匙有一把复制的。这可能就是这个例外的原因。如您提供的错误所示,用户名似乎有重复项。您的新问题与旧问题完全无关。您收到CORS错误,因为服务器发送的错误响应没有相应的CORS头。您的新问题与旧问题完全无关。您收到一个CORS错误,因为服务器发送的错误响应没有相应的CORS头。