Composure + Swagger с аутентификацией basi c - PullRequest
2 голосов
/ 24 февраля 2020

Я пытаюсь создать веб-сервис, используя compojure и swagger с очень простой базовой аутентификацией c. Я хотел бы, чтобы аутентификация была единой, например, «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 с базовой аутентификацией c для одного фиксированного пользователя? Я родом из python, и с 1011 * сделать это досадно легко. Мне было интересно, есть ли простое и элегантное решение, не получая слишком много подробностей.

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

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

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

1 Ответ

2 голосов
/ 25 февраля 2020

Вы можете добавить обработчик звонков, который обеспечивает базовую аутентификацию c. Например, ring-basi c -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?))
...