This is Haskell library built on top of the async-refresh package
implementing the logic for refreshing of expiring access tokens.
Usage
Create new token types.
Make the tokens be instances of the IsToken type classes by
defining the tokenScopes method and (optionally) tokenName (a
human readable label for this token).
Use newEmptyTokenStore to create a new token stores (token stores
are basically TVars containing the tokens wrapped in Either SomeException).
Create a new configuration by adjusting defaultTokenConf using the
functions tokenConfAddRequest and tokenConfSetFactor. The
function tokenConfAddRequest expects values of type RequestToken
— 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 using
readTVar (and pattern matching on Right).
Example
{-# 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