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. Using the DataKinds extension we can do
this via data MyAppTokens = TokenFoo | TokenBar.
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).
Create new token stores (which are basically TVar's containing the tokens wrapped in Either SomeException) using newEmptyTokenStore`.
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.
Example
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
data MyAppTokens = TokenFoo | TokenBar
instance IsToken 'TokenFoo where
tokenScopes _ = ["foo.read", "foo.write"]
createTokenStoreFoo :: IO (TokenStore 'TokenFoo)
createTokenStoreFoo = runStderrLoggingT $ 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