Как настроить yada, чтобы разрешить запросы из разных источников (Clojure)?

У меня настроен ресурс yada, как показано ниже:

(yada/resource
    {:methods {:get
               {:produces "text/plain"
                :response (fn [ctx]
                            "Hello world!!")}}})

и curl -i localhost:8080/api/new возвращает:

HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Length: 13
Content-Type: text/plain
Server: Aleph/0.4.4
Connection: Keep-Alive
Date: Thu, 12 Dec 2019 18:50:42 GMT

Hello world!!

Но когда я добавляю конфигурацию контроля доступа, чтобы разрешить происхождение:

(yada/resource
    {:methods {:get
               {:produces "text/plain"
                :response (fn [ctx]
                            "Hello world!!")}}
     :access-control {:allow-origin "*"}})

Я не вижу дополнительного заголовка:

HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Length: 13
Content-Type: text/plain
Server: Aleph/0.4.4
Connection: Keep-Alive
Date: Thu, 12 Dec 2019 18:52:32 GMT

Hello world!!

Я также пробовал использовать пример из https://juxt.pro/yada/manual/index.html, но получил те же результаты.

И я вижу страшное Access to resource at ... from origin ... has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource когда я пытаюсь получить доступ к конечной точке из своего пользовательского интерфейса.

Что мне не хватает в этой конфигурации?

2 ответа

Я смог использовать следующий обходной путь:

(yada/resource
    {:methods {:get
               {:produces "text/plain"
                :response (fn [ctx]
                            (let [response (:response ctx)
                                  updated-response (assoc-in response [:headers] {"Access-Control-Allow-Origin" "*"})]
                              (prn updated-response)
                              updated-response))}}})

Это обходит встроенный механизм ответа. Я все еще хотел бы знать правильный путь.

Я думаю, что ваша конфигурация верна (с обычными оговорками о разрешении"*"). Я думаю, что yada на самом деле не создает заголовки, если в запросе нетOrigin заголовок:

(defn access-control-headers [ctx]
  (if-let [origin (get-in ctx [:request :headers "origin"])]
    ;...

Это может объяснить разницу между вашим вызовом curl и вашим реальным клиентом. Попробуйте использовать curl -H "Origin: http://origin" -vi http://server/endpoint проверить.

Другие вопросы по тегам