async-refresh-tokens
About
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