Express Шлюз (ключ-аутентификация включен), выдающий CORs при вызове из внешнего приложения - PullRequest
0 голосов
/ 09 апреля 2020

Проблема с описанием

У меня разработано и развернуто мое интерфейсное приложение с использованием Angular и nginx соответственно.

Сервер ресурсов разработан с использованием Без нагрузки NodeJS.

Поток равен

UI -> express gateway -> resource server

Всякий раз, когда вы пытаетесь вызвать API из пользовательского интерфейса , с включенной key-auth в express шлюзе, получая ошибку

Доступ к XMLHttpRequest по 'http://ip: порт / api / имя_функции ' из источника 'http://url 'было заблокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

Same API when called from Postman works though. It also works if I remove 'key-auth' from gateway. 

Совместное использование изменений кода, выполненных на различных уровнях:

Код - Express Шлюз

example:
    apiEndpoints:
      - example
    policies:
      - cors:
          - action:
              origin: ["*"]
              methods: "HEAD,GET,PUT,PATCH,POST,DELETE,OPTIONS"
              preflightContinue: true
              optionsSuccessStatus: 204
              maxAge: 600
              allowedHeaders:
                [
                  "Origin, X-Requested-With, Content-Type, Accept, Authorization",
                ]
      - key-auth:
          - condition:
              name: not
              condition:
                  name: method
                  methods:
                    - OPTIONS
      - proxy:
          - action:
              serviceEndpoint: exampleService
              proxyTimeout: 0

Код - Angular

const httpOptions = {
    headers: new HttpHeaders({
        'Content-Type': 'Application/json; charset=UTF-8',
        'Authorization': "Bearer " + apiKey,
        'Access-Control-Allow-Origin': '*'
    }),
};

Код - Сервер ресурсов - маршруты. js

export default function routes(app) {
   app.use(cors());
   // Also tried setting res.setHeader explicitly, but no success.
}

Код - nginx уровень

server(){
   ...
   location / {
        # Simple Requests
        if ($request_method ~* "(GET|POST)") {
             add_header "Access-Control-Allow-Origin"  *;
        }

        # Preflighted requests
        if ($request_method = OPTIONS ) {
             add_header "Access-Control-Allow-Origin"  *;
             add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
             add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
             return 200;
        }

        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
   }
}

Я прошел через различные л чернила по этой проблеме, пробовал несколько вещей, как показано выше, но не мог найти никакого решения, таким образом поднимая новое.

Как удалить эту ошибку CORs?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

также полезно для решения проблемы проверки JWT на шлюзе

0 голосов
/ 21 апреля 2020

Я решил проблему после внесения приведенных ниже исправлений / изменений:

Код - Angular (Замененный носитель с apiKey)

const httpOptions = {
    headers: new HttpHeaders({
        'Content-Type': 'Application/json; charset=UTF-8',
        'Authorization': "apiKey " + apiKey,
        'Access-Control-Allow-Origin': '*'
    }),
};

Код - nginx уровень (изменено условие в функции определения местоположения)

server {
        ....
        location / {
            if ($request_method = OPTIONS) {
                return 204;
            }
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Max-Age 3600;
            add_header Access-Control-Expose-Headers Content-Length;
            add_header Access-Control-Allow-Headers Range;
            try_files $uri $uri/ =404;
        }
}

Все остальное остается прежним.

...