Package implementing core logic for refreshing of expiring access tokens

Version on this page:
LTS Haskell 15.15:
Stackage Nightly 2020-06-05:
Latest on Hackage:

See all snapshots async-refresh-tokens appears in

BSD-3-Clause licensed by Moritz Schulte
Maintained by [email protected]

Module documentation for

This version can be pinned in stack with:[email protected]:9cce86b4d2e972b25d1052c464d656e20f7b3933d416f9a275db05fc89dd99d0,2102

async-refresh-tokens Hackage version Stackage version Build Status


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 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).


{-# LANGUAGE OverloadedStrings   #-}

data TokenFoo

instance IsToken TokenFoo where
  tokenScopes _ = ["", "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