{-# LANGUAGE DataKinds          #-}
{-# LANGUAGE DeriveDataTypeable #-}

{-# LANGUAGE PolyKinds          #-}

module Servant.API.BasicAuth where

import           Data.ByteString
                 (ByteString)
import           Data.Kind
                 (Type)
import           Data.Typeable
                 (Typeable)
import           GHC.TypeLits
                 (Symbol)


-- | Combinator for <https://tools.ietf.org/html/rfc2617#section-2 Basic Access Authentication>.
--
-- *IMPORTANT*: Only use Basic Auth over HTTPS! Credentials are not hashed or
-- encrypted. Note also that because the same credentials are sent on every
-- request, Basic Auth is not as secure as some alternatives. Further, the
-- implementation in servant-server does not protect against some types of
-- timing attacks.
--
-- In Basic Auth, username and password are base64-encoded and transmitted via
-- the @Authorization@ header. Handshakes are not required, making it
-- relatively efficient.
data BasicAuth (realm :: Symbol) (userData :: Type)
  deriving (Typeable)

-- | A simple datatype to hold data required to decorate a request
data BasicAuthData = BasicAuthData { basicAuthUsername :: !ByteString
                                   , basicAuthPassword :: !ByteString
                                   }
