This is Haskell library built on top of the async-refresh package implementing the logic for refreshing of expiring access tokens.
-
Create new token types.
-
Make the tokens be instances of the
IsToken
type classes by defining thetokenScopes
method and (optionally)tokenName
(a human readable label for this token). -
Use
newEmptyTokenStore
to create a new token stores (token stores are basicallyTVar
s containing the tokens wrapped inEither SomeException
). -
Create a new configuration by adjusting
defaultTokenConf
using the functionstokenConfAddRequest
andtokenConfSetFactor
. The functiontokenConfAddRequest
expects values of typeRequestToken
— these values encapsulate the token stores together with a token-refreshing action. -
Use
newTokenRefresher
to initiate token refreshing for each registered token refreshing request. -
To use the current token, extract it from the
TVar
usingreadTVar
(and pattern matching onRight
).
{-# LANGUAGE OverloadedStrings #-}
data TokenFoo
instance IsToken TokenFoo where
tokenScopes _ = ["foo.read", "foo.write"]
createTokenStoreFoo :: LoggingT IO (TokenStore TokenFoo)
createTokenStoreFoo = do
tokenFoo <- newEmptyTokenStore (Proxy :: Proxy TokenFoo)
let conf = defaultTokenConf
& tokenConfAddRequest (RequestToken tokenFoo actionFoo)
_ <- newTokenRefresher conf
return tokenFoo
where actionFoo :: (MonadIO m, IsToken t) => m (RefreshResult (Token t))
actionFoo =
return $ RefreshResult (Token "secret-foo-token") Nothing