{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Web.OIDC.Client.Discovery.Provider
(
Provider(..)
, Configuration(..)
, JwsAlgJson(..)
) where
import Data.Aeson (FromJSON, parseJSON, withText)
import Data.Aeson.TH (Options (..), defaultOptions,
deriveFromJSON)
import Data.Aeson.Types (camelTo2)
import Data.Text (Text, unpack)
import Jose.Jwa (JwsAlg (..))
import Jose.Jwk (Jwk)
import Web.OIDC.Client.Types (IssuerLocation, ScopeValue)
data Provider = Provider { configuration :: Configuration, jwkSet :: [Jwk] }
newtype JwsAlgJson = JwsAlgJson { getJwsAlg :: JwsAlg } deriving (Show, Eq)
instance FromJSON JwsAlgJson where
parseJSON = withText "JwsAlgJson" $ \case
"HS256" -> pure $ JwsAlgJson HS256
"HS384" -> pure $ JwsAlgJson HS384
"HS512" -> pure $ JwsAlgJson HS512
"RS256" -> pure $ JwsAlgJson RS256
"RS384" -> pure $ JwsAlgJson RS384
"RS512" -> pure $ JwsAlgJson RS512
"ES256" -> pure $ JwsAlgJson ES256
"ES384" -> pure $ JwsAlgJson ES384
"ES512" -> pure $ JwsAlgJson ES512
"none" -> pure $ JwsAlgJson None
other -> fail $ "Non-supported alg: " <> show (unpack other)
data Configuration = Configuration
{ issuer :: IssuerLocation
, authorizationEndpoint :: Text
, tokenEndpoint :: Text
, userinfoEndpoint :: Maybe Text
, revocationEndpoint :: Maybe Text
, jwksUri :: Text
, responseTypesSupported :: [Text]
, subjectTypesSupported :: [Text]
, idTokenSigningAlgValuesSupported :: [JwsAlgJson]
, scopesSupported :: Maybe [ScopeValue]
, tokenEndpointAuthMethodsSupported :: Maybe [Text]
, claimsSupported :: Maybe [Text]
}
deriving (Show, Eq)
$(deriveFromJSON defaultOptions{fieldLabelModifier = camelTo2 '_'} ''Configuration)