# Ошибка CORS с Access-Control-Allow-Headers в API после обновления Discourse

**URL:** https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716
**Category:** Support
**Created:** [12.Апрель.2020 16:51:16 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716 "2020-04-12T16:51:16Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![pablogg](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pablogg/32/164759_2.png) [@pablogg](https://meta.discourse.org/u/pablogg)
#### Post date: [12.Апрель.2020 16:51:16 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/1 "2020-04-12T16:51:16Z")

</div>

Я обновил Discourse вчера, и все API-колбэки возвращают ошибку. Я выяснил, что проблема в заголовках аутентификации (1), но при попытке выполнить несколько запросов получаю следующую ошибку:

`Доступ к XMLHttpRequest по адресу 'https://mydomain.com/notifications.json?username=admin' с источника 'https://mydomain.com' заблокирован политикой CORS: поле заголовка запроса api-username не разрешено в Access-Control-Allow-Headers в ответе на префлигт-запрос.`

Я использую Vue и добавил api-key и api-username в заголовки следующим образом:

```
Vue.http
        .get(
             "https://discourse.mydomain.com/notifications.json?username="+input.username,
          {
            headers: {
             "Api-Key":"xxxxxxxxxxxxxxxxx",
             "Api-Username": "system",
              "content-type": "application/json",
              accept: "application/json"
            }
          }
        )

```

(1) [Discourse REST API Documentation](https://meta.discourse.org/t/discourse-api-documentation/22706)

---

<div class="post-metadata">

### Author: ![blake](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blake/32/157322_2.png) [@blake](https://meta.discourse.org/u/blake)
#### Post date: [12.Апрель.2020 17:29:15 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/2 "2020-04-12T17:29:15Z")

</div>

Возможно, вам потребуется настроить CORS в настройках вашего сайта?

---

<div class="post-metadata">

### Author: ![pablogg](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pablogg/32/164759_2.png) [@pablogg](https://meta.discourse.org/u/pablogg)
#### Post date: [12.Апрель.2020 17:54:15 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/3 "2020-04-12T17:54:15Z")

</div>

Да, я добавил домен, с которого вызывается API, в настройки Discourse, но ошибка, связанная с полем api-username, возникла. Я не знаю, когда мне её нужно устранить.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [12.Апрель.2020 18:05:43 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/4 "2020-04-12T18:05:43Z")

</div>

> [@pablogg](#):
>
> Я использую Vue
> 
> ```
> "Api-Key":"xxxxxxxxxxxxxxxxx", 
> "Api-Username": "system",
> 
> ```

Вы размещаете свой API-ключ `system` в клиентском коде? 😱  
Это означает, что любой может извлечь его из вашего JavaScript-кода и полностью _захватить_ ваш форум.

Любые Ajax HTTP-запросы к Discourse должны использовать существующую сессию или вообще не требовать сессии.

---

<div class="post-metadata">

### Author: ![pablogg](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pablogg/32/164759_2.png) [@pablogg](https://meta.discourse.org/u/pablogg)
#### Post date: [12.Апрель.2020 18:09:06 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/5 "2020-04-12T18:09:06Z")

</div>

Это не просто тестирование, я использую имя пользователя:

```javascript
Vue.http
  .get(
    "https://discourse.mydomain.com/notifications.json?username=" + input.username,
    {
      headers: {
        "Api-Key": "xxxxxxxxxxxxxxxxxxxxxx",
        "Api-Username": input.username
      }
    }
  )

```

Однако я получаю ту же ошибку, связанную с CORS и полем api-username.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [12.Апрель.2020 18:09:43 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/6 "2020-04-12T18:09:43Z")

</div>

Позвольте мне повторить сказанное мной:

> [@RGJ](#):
>
> Все Ajax-запросы HTTP к Discourse должны использовать существующую сессию.

Это означает: никаких заголовков аутентификации. Ни при каких обстоятельствах.

---

<div class="post-metadata">

### Author: ![blake](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blake/32/157322_2.png) [@blake](https://meta.discourse.org/u/blake)
#### Post date: [12.Апрель.2020 18:24:26 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/7 "2020-04-12T18:24:26Z")

</div>

Вам действительно не следует использовать эти учетные данные API для CORS-запросов, именно поэтому это поле заголовка не разрешено.

> [@CORS error accessing API from javascript application](https://meta.discourse.org/t/cors-error-accessing-api-from-javascript-application/128785/6?u=blake):
>
> Oh, so you are trying to make this request from a client-side javascript application? That is not permitted for numerous reasons. For example, if you include an admin API key in the source code of your javascript app, any user could gain full admin access to your forum. [Here is](https://meta.discourse.org/t/what-are-the-risks-of-enabling-cross-origin-resource-sharing-discourse-enable-cors/41248) a previous topic on the subject.

Однако мы разрешаем заголовки [user-api](https://meta.discourse.org/t/user-api-keys-specification/48536) в CORS:

> [@Request header field User-Api-Key is not allowed by Access-Control-Allow-Headers](https://meta.discourse.org/t/request-header-field-user-api-key-is-not-allowed-by-access-control-allow-headers/92662/4?u=blake):
>
> I’m trying to post comments to my Discourse instance from another web application using user api keys. I managed to get the user key following the method described in your [original topic](https://meta.discourse.org/t/user-api-keys-specification/48536) and this [other useful discussion](https://meta.discourse.org/t/generating-user-api-keys-with-rest-api/61916). After getting the key, when I send it along with my requests as a value of the User-Api-Key header, I get the Request header field User-Api-Key is not allowed by Access-Control-Allow-Headers error. As I [asked in my PR](https://github.com/discourse/discourse/pull/6107#issuecomment-406568320), I’m not sure if it’s enough to add the headers in the file…

---

<div class="post-metadata">

### Author: ![pablogg](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pablogg/32/164759_2.png) [@pablogg](https://meta.discourse.org/u/pablogg)
#### Post date: [12.Апрель.2020 19:14:16 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/8 "2020-04-12T19:14:16Z")

</div>

Я ознакомился со [спецификацией ключей API пользователей](https://meta.discourse.org/t/user-api-keys-specification/48536)…

В моём случае используется SSO с фронтенд-приложением на JavaScript. Возможно ли использовать API без отображения интерфейса авторизации для каждого пользователя? Мне нужен способ использования api-username… Это возможно?

С уважением

---

<div class="post-metadata">

### Author: ![federico\_lezcano](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/federico_lezcano/32/187720_2.png) [@federico\_lezcano](https://meta.discourse.org/u/federico_lezcano)
#### Post date: [22.Июль.2020 04:39:36 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/9 "2020-07-22T04:39:36Z")

</div>

Не могли бы вы решить это?  
Спасибо!

---

<div class="post-metadata">

### Author: ![pablogg](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pablogg/32/164759_2.png) [@pablogg](https://meta.discourse.org/u/pablogg)
#### Post date: [22.Июль.2020 07:27:17 UTC](https://meta.discourse.org/t/acess-control-allow-headers-cors-error-with-api-after-updating-discourse/147716/10 "2020-07-22T07:27:17Z")

</div>

В итоге я вернулся к предыдущей версии Discourse, чтобы не пришлось менять всю интеграцию с API.
