Clojure http-kit: настройка CORS не работает - PullRequest
1 голос
/ 01 июля 2019

Мой простой сервер http-kit:

(ns figgy.core
  (:gen-class)
  (:require [org.httpkit.server :as server]
            [compojure.core :refer :all]
            [ring.middleware.cors :refer [wrap-cors]]
            [compojure.route :as route]))
(defn fps-handler [req]
  {:status  200
   :headers {"Content-Type" "text/html"}
   :body    "Pew pew!"})

(defn mail-man []
   "{\"Spongebob Narrator\": \"5 years later...\"}")

(defn mail-handler [req]
  {:status  200
   :headers {"Content-Type" "text/json"} ;(1)
   :body    (mail-man)}) ;(2)

(defn general-handler [req]
  {:status  200
   :headers {"Content-Type" "text/html"}
   :body    "All hail General Zod!"})

(defroutes app-routes ;(3)
  (GET "/" [] fps-handler)
  (POST "/postoffice" [] mail-handler)
  (ANY "/anything-goes" [] general-handler)
  (route/not-found "You Must Be New Here")) ;(4)

(def app
  (-> app-routes
    (wrap-cors
     :access-control-allow-origin [#".*"]
     :access-control-allow-headers ["Content-Type"]
     :access-control-allow-methods [:get :put :post :delete :options])))

(defn -main
  "This is our app's entry point"
  [& args]
  (let [port (Integer/parseInt (or (System/getenv "PORT") "8080"))]
    (server/run-server #'app {:port port})
    (println (str "Running webserver at http:/127.0.0.1:" port "/"))))

Каждый раз, когда я звоню из своего приложения JS, я получаю сообщение об ошибке CORS, несмотря на установку wrap-cors

Доступ к XMLHttpRequest в 'http://localhost:8080/' от источника' http://localhost:9500' был заблокирован политикой CORS: Ответ на предпечатный запрос не проходит проверку контроля доступа: Нет 'Access-Заголовок Control-Allow-Origin 'присутствует в запрашиваемом ресурсе

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Ответ может лежать в вашем комментарии.

wrap-cors действительно работает, проблема заключается в том, что когда я включаю: headers {: authorization (пароль электронной почты basic-auth-header)} в коде на стороне клиента запрос к серверной части завершается неудачно.-

Это будет работать.:access-control-allow-headers ["Content-Type" "Authorization"].

Кстати, я хочу спросить, является ли ваш код в вашем вопросе фактическим кодом в вашем приложении.Если вы используете какое-то промежуточное ПО для аутентификации, вы должны добавить wrap-cors перед промежуточным ПО для аутентификации.Браузеры не включают заголовок «Аутентификация» в предварительный запрос OPTIONS автоматически, после чего запросы не выполняются.Если вы хотите сделать wrap-cors, это может решить вашу проблему.

Обозреватель devtool также поможет вам в отладке.Предварительные запросы и ответы вы можете увидеть на вкладке Сеть в Chrome devtool.

0 голосов
/ 01 июля 2019

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

{"Access-Control-Allow-Origin" origin
 "Access-Control-Allow-Credentials" "true"
 "Access-Control-Allow-Methods" "POST, GET, OPTIONS, PUT, DELETE"
 "Access-Control-Allow-Headers" "Content-Type, Accept, Authorization, Authentication, If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since"}

Я вырезал специфичные для приложения.Возможно, вам придется добавить больше, например X-My-Auth-Thing в раздел заголовков.

...