CORS错误:请求标头字段预检响应中的Access-Control-Allow-Headers不允许授权

我试图从一个本地主机端口发送请求到另一个。 我在前端使用angularjs,在后端使用angularjs

既然是CORS请求,在node.js中,我正在使用

res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH'); res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization'); 

并在angular.js服务文件中,我正在使用

 return { getValues: $resource(endpoint + '/admin/getvalues', null, { 'get': { method: 'GET', headers:{'Authorization':'Bearer'+' '+ $localStorage.token} } }), } 

我收到以下错误

请求标头字段预检响应中的Access-Control-Allow-Headers不允许授权。

请帮忙!

您还必须在允许的标题中添加选项。 浏览器在发送原始请求之前发送预闪请求。 见下文

  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS'); 

来源https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS

在CORS中,使用OPTIONS方法发送预检请求,以便服务器可以响应以这些参数发送请求是否可接受。 访问控制请求方法头通知服务器作为预检请求的一部分,当发送实际的请求时,它将以POST请求方法发送。 Access-Control-Request-Headers报头通知服务器,当实际的请求被发送时,它将被发送X-PINGOTHER和Content-Type自定义标题。 服务器现在有机会确定它是否希望在这种情况下接受请求。

EDITED

你可以通过使用npmjs.com/package/cors npm package来避免这种手动configuration。我也使用了这个方法,它很简单明了。

这是一个API问题,如果使用Postman / Fielder发送HTTP请求到API,你不会得到这个错误。 在浏览器的情况下,为了安全起见,在发送实际请求(GET / POST / PUT / DELETE)之前,他们总是发送OPTIONS请求/预检到API。 因此,如果请求方法是OPTION,不仅需要在“Access-Control-Allow-Headers”中添加“Authorization”,而且还需要在“Access-Control-allow-methods”中添加“OPTIONS”为好。 这是我如何修复:

 if (context.Request.Method == "OPTIONS") { context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] }); context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept, Authorization" }); context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" }); context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); } 

如果你不想安装Cors库,而是想修复你的原始代码,那么你缺less的另一个步骤就是Access-Control-Allow-Origin:*是错误的。 当传递身份validation令牌(例如JWT)时,您必须明确指出每个调用您的服务器的URL。 authentication令牌不能使用“*”。