首页 > 解决方案 > 如何使用 swagger2 和服务人员记录通用身份验证组合器

问题描述

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

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

type instance AuthServerData (AuthProtect "JWT") = AuthUser

这是在授权标头中出现的。我目前收到以下错误:

    • 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 实例。

标签: haskellswaggerservant

解决方案


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

{-# LANGUAGE ScopedTypeVariables #-}

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

请注意,这是一个存根实例,可以使其在编译时“工作”,但不会在文档中生成任何关于身份验证的提及。如果你想要这样,你必须编写一个真正的实现toSwagger。如果你想这样做,其余的实例可能是一个有用的起点。


推荐阅读