diff --git a/src/Yesod/Auth/OAuth2.hs b/src/Yesod/Auth/OAuth2.hs index d9b99e5..ed1b794 100644 --- a/src/Yesod/Auth/OAuth2.hs +++ b/src/Yesod/Auth/OAuth2.hs @@ -19,6 +19,7 @@ module Yesod.Auth.OAuth2 -- * Reading our @'credsExtra'@ keys , getAccessToken + , getRefreshToken , getUserResponse , getUserResponseJSON ) where @@ -67,6 +68,14 @@ getAccessToken :: Creds m -> Maybe AccessToken getAccessToken = (AccessToken <$>) . lookup "accessToken" . credsExtra +-- | Read the @'RefreshToken'@ from the values set via @'setExtra'@ +-- +-- N.B. not all providers supply this value. +-- +getRefreshToken :: Creds m -> Maybe RefreshToken +getRefreshToken = + (RefreshToken <$>) . lookup "refreshToken" . credsExtra + -- | Read the original profile response from the values set via @'setExtra'@ getUserResponse :: Creds m -> Maybe ByteString getUserResponse = diff --git a/src/Yesod/Auth/OAuth2/Prelude.hs b/src/Yesod/Auth/OAuth2/Prelude.hs index 44673c0..0dcb178 100644 --- a/src/Yesod/Auth/OAuth2/Prelude.hs +++ b/src/Yesod/Auth/OAuth2/Prelude.hs @@ -114,13 +114,18 @@ scopeParam d = ("scope",) . encodeUtf8 . T.intercalate d -- | Construct part of @'credsExtra'@ -- --- Sets the following keys: +-- Always the following keys: -- -- - @accessToken@: to support follow-up requests -- - @userResponse@: to support getting additional information -- +-- May set the following keys: +-- +-- - @refreshToken@: if the provider supports refreshing the @accessToken@ +-- setExtra :: OAuth2Token -> BL.ByteString -> [(Text, Text)] setExtra token userResponse = [ ("accessToken", atoken $ accessToken token) , ("userResponse", decodeUtf8 $ BL.toStrict userResponse) ] + <> maybe [] (pure . ("refreshToken",) . rtoken) (refreshToken token)