В запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin» - PullRequest
0 голосов
/ 02 сентября 2018

Я пишу приложение, которое использует Angular для клиентской стороны и NodeJ для серверной части. Я размещаю свое приложение с iis и iisnode.

Недавно я добавил проверку подлинности Windows в свое приложение, чтобы я мог знать, какой пользователь вошел в систему.

Большинство запросов работает нормально, но у меня возникла проблема авторизации с запросом, который выходит из другого маршрута (/ manage), но из того же источника.

Мой угловой код:

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» в запрошенном Resouce. Исходный код 'http://myurl' поэтому запрещен.

Единственная разница между этими двумя запросами состоит в том, что первый вызывается из 'http://myurl', а второй вызывается из' http://myurl/manage'. Хотя, когда я смотрю на вкладку сети в браузере, я вижу, что источником неудавшегося запроса является 'http://myurl'.

Почему «Access-Control-Allow-Origin» не представлен и как я могу его решить? Спасибо.

1 Ответ

0 голосов
/ 02 сентября 2018

Вы можете Cors , чтобы сделать это.

CORS - это пакет node.js для предоставления промежуточного программного обеспечения Connect / Express, которое можно использовать для включения CORS с различными параметрами.

1 Установка Cors .

npm install cors

2 Затем используйте его в своем приложении Express.

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));
...