Самообладание + Swagger с базовой аутентификацией

Я пытаюсь создать веб-сервис, используя compojure и swagger с очень простой базовой аутентификацией. Я бы хотел, чтобы аутентификация была единой, например, "mylogin" и "mypassword" для логина и пароля. Пока что у меня есть

(ns my-api.handler
  (:require [compojure.api.sweet :refer :all]
            [ring.util.http-response :refer :all]
            [schema.core :as s]))

(s/defschema Request
  {:SomeData s/Str})

(s/defschema Result
  {:Results s/Str})

(defn dummy-return [request]
  {:Results "This is a dummy return"})

(def app
  (api
   {:swagger
    {:ui "/"
     :spec "/swagger.json"
     :data {:info {:title "A testing API"
                   :description "Compojure Api example"}
            :tags [{:name "api", :description "some apis"}]}}}

   (context "/api" []
     :tags ["api"]
     (POST "/API-Example" []
       :body [request Request]
       :return Result
       :summary "I want this to have a fixed basic authentication"
       (ok (dummy-return request))))))

И это работает так, как ожидалось. Но как мне сделать этот самый API с базовой аутентификацией для одного фиксированного пользователя? Я родом из Python, и сделать это с Flask досадно легко. Мне было интересно, есть ли простое и элегантное решение, не слишком многословное.

Я попытался включить некоторые вещи, такие как :securityDefinitions {:login {:type "basic" :password "test"}}, на тот же уровень, что и :data, но я мог вызывать API даже без аутентификации.

Я начал этот проект с lein new compojure-api my-api

Спасибо за помощь!


person Lucas Moreira    schedule 24.02.2020    source источник


Ответы (1)


Вы можете добавить обработчик кольца, обеспечивающий базовую аутентификацию. Например, ring-basic-authentication.

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

(require '[ring.middleware.basic-authentication :refer [wrap-basic-authentication]])

(defn authenticated? [username pass]
  (and (= username "foo")
       (= pass "bar")))

(def app 
   (-> routes
       ..
       (wrap-basic-authentication authenticated?))
person Erwin Rooijakkers    schedule 25.02.2020
comment
Спасибо! Это сработало! Я не знаю, слишком ли это очевидно, но, чтобы помочь будущим новичкам, в ответ маршруты в моем примере все на уровне API - person Lucas Moreira; 26.02.2020