如何使用 swagger2 和 servant 记录通用身份验证组合器

How are Generalized Authentication Combinators Documented with swagger2 and servant

我有一个自定义身份验证机制,我希望它与 servant-swagger 输出的 swagger 文档兼容。

data AuthUser = AuthUser 
  { auth_user_id :: Int64 
  , auth_user_email :: Text
  } deriving (Eq, Show, Generic)

type instance AuthServerData (AuthProtect "JWT") = AuthUser

这是一项授权 Header。我目前收到以下错误:

    • No instance for (HasSwagger
                         (Servant.API.Experimental.Auth.AuthProtect "JWT"
                          Servant.API.Sub.:> Servant.API.Verbs.Get
                                               '[Servant.API.ContentTypes.JSON] Int))

这条路线:

:<|> "todo" :> AuthProtect "JWT" :> ReqBody '[JSON] NewTodo :> Post '[JSON] Int64

是否有为通用验证编写 HasSwagger 实例的任何文档。

看起来 servant-swagger 只是还没有添加必要的实例来让它工作,可能是因为它仍然被标记为实验性的。如果您正在编写一个程序而不是一个库,那么您可以添加这个孤儿实例以使其工作:

{-# LANGUAGE ScopedTypeVariables #-}

instance HasSwagger sub => HasSwagger (AuthProtect tag :> sub) where
  toSwagger _ = toSwagger (Proxy :: Proxy sub)

请注意,这是一个存根实例,它将在编译时成为 "work",但它不会在文档中生成任何关于身份验证的提及。如果你想要那样,你必须编写 toSwagger 的真正实现。如果您想这样做,the rest of the instances 可能是一个有用的起点。