请求的资源上没有“ Access-Control-Allow-Origin”标头

时间:2018-09-02 11:01:10

标签: node.js angular express iis iisnode

我正在编写将Angular用于客户端并将NodeJs用于后端的应用程序。 我使用iis和iisnode托管我的应用程序。

最近我在应用程序中添加了Windows身份验证,这样我就可以知道哪个用户登录了。

大多数请求都可以正常工作,但是我遇到了来自另一个路由(/管理)但来自同一来源的请求的授权问题。

我的Angular代码:

var url = "http://localhost:15001/auth/"+entredPass;
this.http.get(url, {withCredentials: true}).subscribe(res => {
    ...
});

我的NodeJs代码:

var app = express();
var allowCrossDomain = function (req, res, next){
    res.header('Access-Control-Allow-Origin', origin); //Gets that from config
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

    if(res.method == 'OPTIONS')
        res.send(200);
    else
        next();
}
app.use(allowCrossDomain);

//This request works
app.get('isAlive', function(req, res){
    res.setHeader('Access-Control-Allow-Origin', origin); //Gets that from config
    res.status(200);
    res.send(true);
});

//This one isn't - why?
app.get('/auth/:password', function (req, res){
    ...
    var authRes = false;
    if (password == "123456")
        authRes = true;

    res.setHeader('Access-Control-Allow-Origin', origin);
    res.status(200);
    res.send(authRes.toString());
});

对于第二个GET,我得到了错误:

  

请求的请求上没有'Access-Control-Allow-Origin'标头   补充。因此,不允许访问源“ http://myurl”。

这两个请求之间的唯一区别是,第一个是从“ http://myurl”调用的,第二个是从“ http://myurl/manage”调用的。 尽管在浏览器中查看“网络”选项卡时,我发现失败请求的来源是“ http://myurl”。

为什么不显示“ Access-Control-Allow-Origin”,我该如何解决? 谢谢。

1 个答案:

答案 0 :(得分:1)

您可以cors这样做。

  

CORS是一个node.js软件包,用于提供可用于通过各种选项启用CORS的Connect / Express中间件。

1 安装cors

npm install cors

2 ,然后在您的Express App中使用它。

const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors());

//This request works
app.get('isAlive', function(req, res) {
  res.setHeader('Access-Control-Allow-Origin', origin); //Gets that from config
  res.status(200);
  res.send(true);
});

//This one isn't - why?
app.get('/auth/:password', function(req, res) {
  ...
  var authRes = false;
  if (password == "123456")
    authRes = true;

  res.setHeader('Access-Control-Allow-Origin', origin);
  res.status(200);
  res.send(authRes.toString());
});

3 (可选),如果需要,您还可以将特定域列入白名单:

const whitelist = ['http://example1.com', 'http://example2.com']
const corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

app.use(cors(corsOptions));