oauth2-jwt-bearer-0.0.1: src/Network/OAuth2/JWT/Client/Data.hs
-- |
-- Data types. You probably want 'Network.OAuth2.JWT.Client'.
--
module Network.OAuth2.JWT.Client.Data (
-- * Claims
Issuer (..)
, Scope (..)
, Audience (..)
, Subject (..)
, Claims (..)
-- * Configuration
, TokenEndpoint (..)
-- * Protocol
, Assertion (..)
, AccessToken (..)
, ExpiresIn (..)
, Response (..)
-- * Client State
, TokenState (..)
, Store (..)
, newStore
) where
import Crypto.JWT (JWK)
import Control.Concurrent.MVar (MVar)
import qualified Control.Concurrent.MVar as MVar
import qualified Data.Aeson as Aeson
import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Time (NominalDiffTime, UTCTime)
import qualified Network.HTTP.Client as HTTP
-- Claims --
newtype Issuer =
Issuer {
getIssuer :: Text
} deriving (Eq, Ord, Show)
newtype Scope =
Scope {
getScope :: Text
} deriving (Eq, Ord, Show)
newtype Audience =
Audience {
getAudience :: Text
} deriving (Eq, Ord, Show)
newtype Subject =
Subject {
getSubject :: Text
} deriving (Eq, Ord, Show)
data Claims =
Claims {
claimsIssuer :: Issuer
, claimsSubject :: Maybe Subject
, claimsAudience :: Audience
, claimsScopes :: [Scope]
, claimsExpires :: ExpiresIn
, claimsCustom :: [(Text, Aeson.Value)]
} deriving (Eq, Show)
-- Configuration --
newtype TokenEndpoint =
TokenEndpoint {
getTokenEndpoint :: Text
} deriving (Eq, Ord, Show)
-- Protocol --
newtype Assertion =
Assertion {
getAssertion :: ByteString
} deriving (Eq, Ord, Show)
newtype AccessToken =
AccessToken {
renderAccessToken :: Text
} deriving (Eq, Ord, Show)
newtype ExpiresIn =
ExpiresIn {
getExpiresIn :: NominalDiffTime
} deriving (Eq, Ord, Show)
data Response =
Response {
responseToken :: AccessToken
, responseExpiry :: ExpiresIn
} deriving (Eq, Ord, Show)
-- Client State --
data TokenState =
NoToken
| HasToken AccessToken UTCTime
data Store =
Store HTTP.Manager TokenEndpoint Claims JWK (MVar TokenState)
newStore :: HTTP.Manager -> TokenEndpoint -> Claims -> JWK -> IO Store
newStore manager endpoint claims jwk =
Store manager endpoint claims jwk <$> MVar.newMVar NoToken