yesod-auth-oauth2 0.7.4.0 → 0.8.0.0
raw patch · 26 files changed
+135/−169 lines, 26 filesdep ~aeson-prettydep ~cryptondep ~hoauth2PVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson-pretty, crypton, hoauth2, hspec, memory, microlens, safe-exceptions, unliftio, uri-bytestring, warp, yesod
API changes (from Hackage documentation)
- Network.OAuth.OAuth2.Compat: OAuth2Token :: AccessToken -> Maybe RefreshToken -> Maybe Int -> Maybe Text -> Maybe IdToken -> OAuth2Token
- Network.OAuth.OAuth2.Compat: [accessToken] :: OAuth2Token -> AccessToken
- Network.OAuth.OAuth2.Compat: [expiresIn] :: OAuth2Token -> Maybe Int
- Network.OAuth.OAuth2.Compat: [idToken] :: OAuth2Token -> Maybe IdToken
- Network.OAuth.OAuth2.Compat: [refreshToken] :: OAuth2Token -> Maybe RefreshToken
- Network.OAuth.OAuth2.Compat: [tokenType] :: OAuth2Token -> Maybe Text
- Network.OAuth.OAuth2.Compat: data () => OAuth2Token
- Network.OAuth.OAuth2.Compat: fetchAccessToken :: Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)
- Network.OAuth.OAuth2.Compat: fetchAccessToken2 :: Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)
- Network.OAuth.OAuth2.Compat: type Errors = TokenResponseError
- Network.OAuth.OAuth2.Compat: type OAuth2Result err a = Either err a
- Yesod.Auth.OAuth2: OAuth2Token :: AccessToken -> Maybe RefreshToken -> Maybe Int -> Maybe Text -> Maybe IdToken -> OAuth2Token
- Yesod.Auth.OAuth2: [accessToken] :: OAuth2Token -> AccessToken
- Yesod.Auth.OAuth2: [expiresIn] :: OAuth2Token -> Maybe Int
- Yesod.Auth.OAuth2: [idToken] :: OAuth2Token -> Maybe IdToken
- Yesod.Auth.OAuth2: [refreshToken] :: OAuth2Token -> Maybe RefreshToken
- Yesod.Auth.OAuth2: [tokenType] :: OAuth2Token -> Maybe Text
- Yesod.Auth.OAuth2: data () => OAuth2Token
- Yesod.Auth.OAuth2.Dispatch: fetchAccessToken :: Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)
- Yesod.Auth.OAuth2.Dispatch: fetchAccessToken2 :: Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)
- Yesod.Auth.OAuth2.Prelude: OAuth2Token :: AccessToken -> Maybe RefreshToken -> Maybe Int -> Maybe Text -> Maybe IdToken -> OAuth2Token
- Yesod.Auth.OAuth2.Prelude: [accessToken] :: OAuth2Token -> AccessToken
- Yesod.Auth.OAuth2.Prelude: [expiresIn] :: OAuth2Token -> Maybe Int
- Yesod.Auth.OAuth2.Prelude: [idToken] :: OAuth2Token -> Maybe IdToken
- Yesod.Auth.OAuth2.Prelude: [refreshToken] :: OAuth2Token -> Maybe RefreshToken
- Yesod.Auth.OAuth2.Prelude: [tokenType] :: OAuth2Token -> Maybe Text
- Yesod.Auth.OAuth2.Prelude: data () => OAuth2Token
- Yesod.Auth.OAuth2.Prelude: type family AuthId master;
+ Network.OAuth.OAuth2.Compat: accessToken :: OAuth2Token -> AccessToken
+ Network.OAuth.OAuth2.Compat: data TokenResponseError
+ Network.OAuth.OAuth2.Compat: expiresIn :: OAuth2Token -> Maybe Int
+ Network.OAuth.OAuth2.Compat: fetchAccessTokenBasic :: Manager -> OAuth2 -> ExchangeToken -> IO (Either TokenResponseError TokenResponse)
+ Network.OAuth.OAuth2.Compat: fetchAccessTokenPost :: Manager -> OAuth2 -> ExchangeToken -> IO (Either TokenResponseError TokenResponse)
+ Network.OAuth.OAuth2.Compat: idToken :: OAuth2Token -> Maybe IdToken
+ Network.OAuth.OAuth2.Compat: refreshToken :: OAuth2Token -> Maybe RefreshToken
+ Network.OAuth.OAuth2.Compat: tokenType :: OAuth2Token -> Maybe Text
+ Network.OAuth.OAuth2.Compat: type TokenResponse = OAuth2Token
+ Yesod.Auth.OAuth2: type TokenResponse = OAuth2Token
+ Yesod.Auth.OAuth2.Dispatch: fetchAccessTokenBasic :: Manager -> OAuth2 -> ExchangeToken -> IO (Either TokenResponseError TokenResponse)
+ Yesod.Auth.OAuth2.Dispatch: fetchAccessTokenPost :: Manager -> OAuth2 -> ExchangeToken -> IO (Either TokenResponseError TokenResponse)
+ Yesod.Auth.OAuth2.Prelude: ($dmmaybeAuthId) :: (YesodAuth master, MonadHandler m, master ~ HandlerSite m, YesodAuthPersist master, Typeable (AuthEntity master)) => m (Maybe (AuthId master))
+ Yesod.Auth.OAuth2.Prelude: ($dmparseJSON) :: (FromJSON a, Generic a, GFromJSON Zero (Rep a)) => Value -> Parser a
+ Yesod.Auth.OAuth2.Prelude: ($dmtoJSON) :: (ToJSON a, Generic a, GToJSON' Value Zero (Rep a)) => a -> Value
+ Yesod.Auth.OAuth2.Prelude: accessToken :: OAuth2Token -> AccessToken
+ Yesod.Auth.OAuth2.Prelude: expiresIn :: OAuth2Token -> Maybe Int
+ Yesod.Auth.OAuth2.Prelude: idToken :: OAuth2Token -> Maybe IdToken
+ Yesod.Auth.OAuth2.Prelude: refreshToken :: OAuth2Token -> Maybe RefreshToken
+ Yesod.Auth.OAuth2.Prelude: tokenType :: OAuth2Token -> Maybe Text
+ Yesod.Auth.OAuth2.Prelude: type AuthId master;
+ Yesod.Auth.OAuth2.Prelude: type TokenResponse = OAuth2Token
- Network.OAuth.OAuth2.Compat: OAuth2 :: Text -> Maybe Text -> URIRef Absolute -> URIRef Absolute -> Maybe (URIRef Absolute) -> OAuth2
+ Network.OAuth.OAuth2.Compat: OAuth2 :: Text -> Text -> URIRef Absolute -> URIRef Absolute -> Maybe (URIRef Absolute) -> OAuth2
- Network.OAuth.OAuth2.Compat: [oauth2ClientSecret] :: OAuth2 -> Maybe Text
+ Network.OAuth.OAuth2.Compat: [oauth2ClientSecret] :: OAuth2 -> Text
- Network.OAuth.OAuth2.Compat: newtype () => AccessToken
+ Network.OAuth.OAuth2.Compat: newtype AccessToken
- Network.OAuth.OAuth2.Compat: newtype () => ExchangeToken
+ Network.OAuth.OAuth2.Compat: newtype ExchangeToken
- Network.OAuth.OAuth2.Compat: newtype () => RefreshToken
+ Network.OAuth.OAuth2.Compat: newtype RefreshToken
- Yesod.Auth.OAuth2: OAuth2 :: Text -> Maybe Text -> URIRef Absolute -> URIRef Absolute -> Maybe (URIRef Absolute) -> OAuth2
+ Yesod.Auth.OAuth2: OAuth2 :: Text -> Text -> URIRef Absolute -> URIRef Absolute -> Maybe (URIRef Absolute) -> OAuth2
- Yesod.Auth.OAuth2: [oauth2ClientSecret] :: OAuth2 -> Maybe Text
+ Yesod.Auth.OAuth2: [oauth2ClientSecret] :: OAuth2 -> Text
- Yesod.Auth.OAuth2: data () => Creds master
+ Yesod.Auth.OAuth2: data Creds master
- Yesod.Auth.OAuth2: data () => Manager
+ Yesod.Auth.OAuth2: data Manager
- Yesod.Auth.OAuth2: type FetchCreds m = Manager -> OAuth2Token -> IO (Creds m)
+ Yesod.Auth.OAuth2: type FetchCreds m = Manager -> TokenResponse -> IO Creds m
- Yesod.Auth.OAuth2.Dispatch: type FetchCreds m = Manager -> OAuth2Token -> IO (Creds m)
+ Yesod.Auth.OAuth2.Dispatch: type FetchCreds m = Manager -> TokenResponse -> IO Creds m
- Yesod.Auth.OAuth2.Dispatch: type FetchToken = Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)
+ Yesod.Auth.OAuth2.Dispatch: type FetchToken = Manager -> OAuth2 -> ExchangeToken -> IO Either TokenResponseError TokenResponse
- Yesod.Auth.OAuth2.DispatchError: OAuth2ResultError :: Errors -> DispatchError
+ Yesod.Auth.OAuth2.DispatchError: OAuth2ResultError :: TokenResponseError -> DispatchError
- Yesod.Auth.OAuth2.Prelude: OAuth2 :: Text -> Maybe Text -> URIRef Absolute -> URIRef Absolute -> Maybe (URIRef Absolute) -> OAuth2
+ Yesod.Auth.OAuth2.Prelude: OAuth2 :: Text -> Text -> URIRef Absolute -> URIRef Absolute -> Maybe (URIRef Absolute) -> OAuth2
- Yesod.Auth.OAuth2.Prelude: [oauth2ClientSecret] :: OAuth2 -> Maybe Text
+ Yesod.Auth.OAuth2.Prelude: [oauth2ClientSecret] :: OAuth2 -> Text
- Yesod.Auth.OAuth2.Prelude: authGetProfile :: FromJSON a => Text -> Manager -> OAuth2Token -> URI -> IO (a, ByteString)
+ Yesod.Auth.OAuth2.Prelude: authGetProfile :: FromJSON a => Text -> Manager -> TokenResponse -> URI -> IO (a, ByteString)
- Yesod.Auth.OAuth2.Prelude: class () => FromJSON a
+ Yesod.Auth.OAuth2.Prelude: class FromJSON a
- Yesod.Auth.OAuth2.Prelude: class () => ToJSON a
+ Yesod.Auth.OAuth2.Prelude: class ToJSON a
- Yesod.Auth.OAuth2.Prelude: data () => AuthPlugin master
+ Yesod.Auth.OAuth2.Prelude: data AuthPlugin master
- Yesod.Auth.OAuth2.Prelude: data () => Creds master
+ Yesod.Auth.OAuth2.Prelude: data Creds master
- Yesod.Auth.OAuth2.Prelude: data () => Manager
+ Yesod.Auth.OAuth2.Prelude: data Manager
- Yesod.Auth.OAuth2.Prelude: data () => Text
+ Yesod.Auth.OAuth2.Prelude: data Text
- Yesod.Auth.OAuth2.Prelude: newtype () => AccessToken
+ Yesod.Auth.OAuth2.Prelude: newtype AccessToken
- Yesod.Auth.OAuth2.Prelude: newtype () => Host
+ Yesod.Auth.OAuth2.Prelude: newtype Host
- Yesod.Auth.OAuth2.Prelude: newtype () => RefreshToken
+ Yesod.Auth.OAuth2.Prelude: newtype RefreshToken
- Yesod.Auth.OAuth2.Prelude: setExtra :: OAuth2Token -> ByteString -> [(Text, Text)]
+ Yesod.Auth.OAuth2.Prelude: setExtra :: TokenResponse -> ByteString -> [(Text, Text)]
Files
- CHANGELOG.md +14/−1
- src/Network/OAuth/OAuth2/Compat.hs +66/−119
- src/Yesod/Auth/OAuth2.hs +6/−6
- src/Yesod/Auth/OAuth2/Auth0.hs +1/−1
- src/Yesod/Auth/OAuth2/AzureAD.hs +1/−1
- src/Yesod/Auth/OAuth2/AzureADv2.hs +1/−1
- src/Yesod/Auth/OAuth2/BattleNet.hs +1/−1
- src/Yesod/Auth/OAuth2/Bitbucket.hs +1/−1
- src/Yesod/Auth/OAuth2/ClassLink.hs +1/−1
- src/Yesod/Auth/OAuth2/Dispatch.hs +7/−4
- src/Yesod/Auth/OAuth2/DispatchError.hs +2/−2
- src/Yesod/Auth/OAuth2/EveOnline.hs +1/−1
- src/Yesod/Auth/OAuth2/Exception.hs +1/−3
- src/Yesod/Auth/OAuth2/GitHub.hs +1/−1
- src/Yesod/Auth/OAuth2/GitLab.hs +1/−1
- src/Yesod/Auth/OAuth2/Google.hs +1/−1
- src/Yesod/Auth/OAuth2/Nylas.hs +1/−1
- src/Yesod/Auth/OAuth2/ORCID.hs +1/−1
- src/Yesod/Auth/OAuth2/Prelude.hs +8/−3
- src/Yesod/Auth/OAuth2/Salesforce.hs +1/−1
- src/Yesod/Auth/OAuth2/Slack.hs +1/−1
- src/Yesod/Auth/OAuth2/Spotify.hs +1/−1
- src/Yesod/Auth/OAuth2/Twitch.hs +1/−1
- src/Yesod/Auth/OAuth2/Upcase.hs +1/−1
- src/Yesod/Auth/OAuth2/WordPressDotCom.hs +1/−1
- yesod-auth-oauth2.cabal +13/−13
CHANGELOG.md view
@@ -1,4 +1,17 @@-## [_Unreleased_](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.7.4.0...main)+## [_Unreleased_](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.8.0.0...main)++## [v0.8.0.0](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.7.4.0...v0.8.0.0)++- Drop support for GHC < 9.4 and hoauth2 < 2.8+- Add support for GHC 9.12 and hoauth2-2.15+- To align our interfaces with hoauth2-2.15:+ - Make `OAuth2 {clientSecret}` non-`Maybe`+ - Replace `OAuthToken` with `TokenResponse`+ - Replace `Errors` with `TokenResponseError`+ - Replace `fetchAccessToken{,2}` with `fetchAccessToken{Basic,Post}`++While technically a major version bump, this change should only affect those+users that maintain their own plugins. ## [v0.7.4.0](https://github.com/thoughtbot/yesod-auth-oauth2/compare/v0.7.3.0...v0.7.4.0)
src/Network/OAuth/OAuth2/Compat.hs view
@@ -2,170 +2,117 @@ module Network.OAuth.OAuth2.Compat ( OAuth2 (..)- , OAuth2Result- , Errors , authorizationUrl- , fetchAccessToken- , fetchAccessToken2+ , fetchAccessTokenBasic+ , fetchAccessTokenPost , authGetBS -- * Re-exports- , module Network.OAuth.OAuth2+ , AccessToken (..)+ , ExchangeToken (..)+ , RefreshToken (..)+ , TokenResponse+ , accessToken+ , refreshToken+ , expiresIn+ , tokenType+ , idToken+ , TokenResponseError ) where +import Control.Monad.IO.Class (MonadIO)+import Control.Monad.Trans.Except (runExceptT) import Data.ByteString.Lazy (ByteString) import Data.Text (Text) import Network.HTTP.Conduit (Manager)+import URI.ByteString++#if MIN_VERSION_hoauth2(2,15,0)+import Network.OAuth2+ ( AccessToken (..)+ , ExchangeToken (..)+ , RefreshToken (..)+ , TokenResponse (..)+ , TokenResponseError+ )+import qualified Network.OAuth2 as OAuth2++#elif MIN_VERSION_hoauth2(2,9,0) import Network.OAuth.OAuth2 ( AccessToken (..) , ExchangeToken (..)- , OAuth2Token (..) , RefreshToken (..)+ , OAuth2Token (..)+ , TokenResponseError ) import qualified Network.OAuth.OAuth2 as OAuth2-import URI.ByteString -#if MIN_VERSION_hoauth2(2,2,0)-import Control.Monad.Trans.Except (ExceptT, runExceptT)-import Data.Maybe (fromMaybe)-#endif+type TokenResponse = OAuth2Token -#if MIN_VERSION_hoauth2(2,9,0)-import Network.OAuth.OAuth2.TokenRequest (TokenResponseError)-type Errors = TokenResponseError-#elif MIN_VERSION_hoauth2(2,7,0)-import Network.OAuth.OAuth2.TokenRequest (TokenRequestError)-type Errors = TokenRequestError #else-import qualified Network.OAuth.OAuth2.TokenRequest as LegacyTokenRequest-import Network.OAuth.OAuth2 (OAuth2Error)-type Errors = OAuth2Error LegacyTokenRequest.Errors-#endif+-- hoauth2-2.8+import Network.OAuth.OAuth2+ ( AccessToken (..)+ , ExchangeToken (..)+ , RefreshToken (..)+ , OAuth2Token (..)+ )+import Network.OAuth.OAuth2.TokenRequest (TokenRequestError)+import qualified Network.OAuth.OAuth2 as OAuth2 -{-# ANN module ("HLint: ignore Use fewer imports" :: String) #-}+type TokenResponse = OAuth2Token+type TokenResponseError = TokenRequestError+#endif data OAuth2 = OAuth2 { oauth2ClientId :: Text- , oauth2ClientSecret :: Maybe Text+ , oauth2ClientSecret :: Text , oauth2AuthorizeEndpoint :: URIRef Absolute , oauth2TokenEndpoint :: URIRef Absolute , oauth2RedirectUri :: Maybe (URIRef Absolute) } -type OAuth2Result err a = Either err a- authorizationUrl :: OAuth2 -> URI authorizationUrl = OAuth2.authorizationUrl . getOAuth2 -fetchAccessToken+fetchAccessTokenBasic :: Manager -> OAuth2 -> ExchangeToken- -> IO (OAuth2Result Errors OAuth2Token)-fetchAccessToken = fetchAccessTokenBasic+ -> IO (Either TokenResponseError TokenResponse)+fetchAccessTokenBasic =+ runFetchAccessToken OAuth2.ClientSecretBasic -fetchAccessToken2+fetchAccessTokenPost :: Manager -> OAuth2 -> ExchangeToken- -> IO (OAuth2Result Errors OAuth2Token)-fetchAccessToken2 = fetchAccessTokenPost+ -> IO (Either TokenResponseError TokenResponse)+fetchAccessTokenPost =+ runFetchAccessToken OAuth2.ClientSecretPost authGetBS :: Manager -> AccessToken -> URI -> IO (Either ByteString ByteString)-authGetBS m a u = runOAuth2 $ OAuth2.authGetBS m a u---- Normalize the rename of record fields at hoauth2-2.0. Our type is the newer--- names and we up-convert if hoauth2-1.x is in use. getClientSecret and--- getRedirectUri handle the differences in hoauth2-2.2 and 2.3.+authGetBS m a u = runExceptT $ OAuth2.authGetBS m a u -#if MIN_VERSION_hoauth2(2,0,0) getOAuth2 :: OAuth2 -> OAuth2.OAuth2-getOAuth2 o = OAuth2.OAuth2+getOAuth2 o =+ OAuth2.OAuth2 { OAuth2.oauth2ClientId = oauth2ClientId o- , OAuth2.oauth2ClientSecret = getClientSecret $ oauth2ClientSecret o+ , OAuth2.oauth2ClientSecret = oauth2ClientSecret o , OAuth2.oauth2AuthorizeEndpoint = oauth2AuthorizeEndpoint o , OAuth2.oauth2TokenEndpoint = oauth2TokenEndpoint o- , OAuth2.oauth2RedirectUri = getRedirectUri $ oauth2RedirectUri o- }-#else-getOAuth2 :: OAuth2 -> OAuth2.OAuth2-getOAuth2 o = OAuth2.OAuth2- { OAuth2.oauthClientId = oauth2ClientId o- , OAuth2.oauthClientSecret = getClientSecret $ oauth2ClientSecret o- , OAuth2.oauthOAuthorizeEndpoint = oauth2AuthorizeEndpoint o- , OAuth2.oauthAccessTokenEndpoint = oauth2TokenEndpoint o- , OAuth2.oauthCallback = getRedirectUri $ oauth2RedirectUri o+ , OAuth2.oauth2RedirectUri = case oauth2RedirectUri o of+ Nothing ->+ error+ "programmer error: yesod-auth-oauth2:OAuth2 must have a Just value set as oauth2RedirectUri before using as an hauth2:OAuth2 value"+ Just uri -> uri }-#endif --- hoauth2-2.2 made oauth2ClientSecret non-Maybe, after 2.0 had just made it--- Maybe so we have to adjust, twice. TODO: change ours type to non-Maybe (major--- bump) and reverse this to up-convert with Just in pre-2.2.--#if MIN_VERSION_hoauth2(2,2,0)-getClientSecret :: Maybe Text -> Text-getClientSecret =- fromMaybe $ error "Cannot use OAuth2.oauth2ClientSecret with Nothing"-#else-getClientSecret :: Maybe Text -> Maybe Text-getClientSecret = id-#endif---- hoauth2-2.3 then made oauth2RedirectUri non-Maybe too. We logically rely on--- instantiating with Nothing at definition-time, then setting it to the--- callback at use-time, which means we can't just change our type and invert--- this shim; we'll have to do something much more pervasive to avoid this--- fromMaybe.--#if MIN_VERSION_hoauth2(2,3,0)-getRedirectUri :: Maybe (URIRef Absolute) -> (URIRef Absolute)-getRedirectUri =- fromMaybe $ error "Cannot use OAuth2.oauth2RedirectUri with Nothing"-#else-getRedirectUri :: Maybe (URIRef Absolute) -> Maybe (URIRef Absolute)-getRedirectUri = id-#endif---- hoauth-2.2 moved most IO-Either functions to ExceptT. This reverses that.--#if MIN_VERSION_hoauth2(2,2,0)-runOAuth2 :: ExceptT e m a -> m (Either e a)-runOAuth2 = runExceptT-#else-runOAuth2 :: IO (Either e a) -> IO (Either e a)-runOAuth2 = id-#endif---- The fetchAccessToken functions grew a nicer interface in hoauth2-2.3. This--- up-converts the older ones. We should update our code to use these functions--- directly.--fetchAccessTokenBasic- :: Manager- -> OAuth2- -> ExchangeToken- -> IO (OAuth2Result Errors OAuth2Token)-fetchAccessTokenBasic m o e = runOAuth2 $ f m (getOAuth2 o) e- where-#if MIN_VERSION_hoauth2(2,6,0)- f = OAuth2.fetchAccessTokenWithAuthMethod OAuth2.ClientSecretBasic-#elif MIN_VERSION_hoauth2(2,3,0)- f = OAuth2.fetchAccessTokenInternal OAuth2.ClientSecretBasic-#else- f = OAuth2.fetchAccessToken-#endif--fetchAccessTokenPost- :: Manager+runFetchAccessToken+ :: MonadIO m+ => OAuth2.ClientAuthenticationMethod+ -> Manager -> OAuth2 -> ExchangeToken- -> IO (OAuth2Result Errors OAuth2Token)-fetchAccessTokenPost m o e = runOAuth2 $ f m (getOAuth2 o) e- where-#if MIN_VERSION_hoauth2(2, 6, 0)- f = OAuth2.fetchAccessTokenWithAuthMethod OAuth2.ClientSecretPost-#elif MIN_VERSION_hoauth2(2,3,0)- f = OAuth2.fetchAccessTokenInternal OAuth2.ClientSecretPost-#else- f = OAuth2.fetchAccessToken2-#endif+ -> m (Either TokenResponseError TokenResponse)+runFetchAccessToken am m o e = runExceptT $ OAuth2.fetchAccessTokenWithAuthMethod am m (getOAuth2 o) e
src/Yesod/Auth/OAuth2.hs view
@@ -11,13 +11,13 @@ ( OAuth2 (..) , FetchCreds , Manager- , OAuth2Token (..)+ , TokenResponse , Creds (..) , oauth2Url , authOAuth2 , authOAuth2Widget - -- * Alternatives that use 'fetchAccessToken2'+ -- * Alternatives that use 'fetchAccessTokenPost' , authOAuth2' , authOAuth2Widget' @@ -49,7 +49,7 @@ authOAuth2 :: YesodAuth m => Text -> OAuth2 -> FetchCreds m -> AuthPlugin m authOAuth2 name = authOAuth2Widget [whamlet|Login via #{name}|] name --- | A version of 'authOAuth2' that uses 'fetchAccessToken2'+-- | A version of 'authOAuth2' that uses 'fetchAccessTokenPost' -- -- See <https://github.com/thoughtbot/yesod-auth-oauth2/pull/129> authOAuth2' :: YesodAuth m => Text -> OAuth2 -> FetchCreds m -> AuthPlugin m@@ -66,9 +66,9 @@ -> OAuth2 -> FetchCreds m -> AuthPlugin m-authOAuth2Widget = buildPlugin fetchAccessToken+authOAuth2Widget = buildPlugin fetchAccessTokenBasic --- | A version of 'authOAuth2Widget' that uses 'fetchAccessToken2'+-- | A version of 'authOAuth2Widget' that uses 'fetchAccessTokenPost' -- -- See <https://github.com/thoughtbot/yesod-auth-oauth2/pull/129> authOAuth2Widget'@@ -78,7 +78,7 @@ -> OAuth2 -> FetchCreds m -> AuthPlugin m-authOAuth2Widget' = buildPlugin fetchAccessToken2+authOAuth2Widget' = buildPlugin fetchAccessTokenPost buildPlugin :: YesodAuth m
src/Yesod/Auth/OAuth2/Auth0.hs view
@@ -52,7 +52,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = host `withPath` "/authorize" `withQuery` [scopeParam " " scopes] , oauth2TokenEndpoint = host `withPath` "/oauth/token"
src/Yesod/Auth/OAuth2/AzureAD.hs view
@@ -48,7 +48,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://login.windows.net/common/oauth2/authorize" `withQuery` [ scopeParam "," scopes
src/Yesod/Auth/OAuth2/AzureADv2.hs view
@@ -89,7 +89,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = tenantUrl "/authorize" `withQuery` [scopeParam " " scopes] , oauth2TokenEndpoint = tenantUrl "/token"
src/Yesod/Auth/OAuth2/BattleNet.hs view
@@ -53,7 +53,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = fromRelative "https" host "/oauth/authorize" , oauth2TokenEndpoint = fromRelative "https" host "/oauth/token" , oauth2RedirectUri = Nothing
src/Yesod/Auth/OAuth2/Bitbucket.hs view
@@ -55,7 +55,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://bitbucket.com/site/oauth2/authorize" `withQuery` [scopeParam "," scopes]
src/Yesod/Auth/OAuth2/ClassLink.hs view
@@ -43,7 +43,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://launchpad.classlink.com/oauth2/v2/auth" `withQuery` [scopeParam "," scopes]
src/Yesod/Auth/OAuth2/Dispatch.hs view
@@ -6,8 +6,8 @@ module Yesod.Auth.OAuth2.Dispatch ( FetchToken- , fetchAccessToken- , fetchAccessToken2+ , fetchAccessTokenBasic+ , fetchAccessTokenPost , FetchCreds , dispatchAuthRequest ) where@@ -31,10 +31,13 @@ -- -- This will be 'fetchAccessToken' or 'fetchAccessToken2' type FetchToken =- Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)+ Manager+ -> OAuth2+ -> ExchangeToken+ -> IO (Either TokenResponseError TokenResponse) -- | How to take an @'OAuth2Token'@ and retrieve user credentials-type FetchCreds m = Manager -> OAuth2Token -> IO (Creds m)+type FetchCreds m = Manager -> TokenResponse -> IO (Creds m) -- | Dispatch the various OAuth2 handshake routes dispatchAuthRequest
src/Yesod/Auth/OAuth2/DispatchError.hs view
@@ -16,7 +16,7 @@ import Control.Monad.Except import Data.Text (Text, pack)-import Network.OAuth.OAuth2.Compat (Errors)+import Network.OAuth.OAuth2.Compat (TokenResponseError) import UnliftIO.Except () import UnliftIO.Exception import Yesod.Auth hiding (ServerError)@@ -30,7 +30,7 @@ | InvalidStateToken (Maybe Text) Text | InvalidCallbackUri Text | OAuth2HandshakeError ErrorResponse- | OAuth2ResultError Errors+ | OAuth2ResultError TokenResponseError | FetchCredsIOException IOException | FetchCredsYesodOAuth2Exception YesodOAuth2Exception | OtherDispatchError Text
src/Yesod/Auth/OAuth2/EveOnline.hs view
@@ -76,7 +76,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://login.eveonline.com/oauth/authorize" `withQuery` [("response_type", "code"), scopeParam " " scopes]
src/Yesod/Auth/OAuth2/Exception.hs view
@@ -1,5 +1,3 @@-{-# LANGUAGE DeriveDataTypeable #-}- module Yesod.Auth.OAuth2.Exception ( YesodOAuth2Exception (..) ) where@@ -21,6 +19,6 @@ -- -- Plugin name and error message. GenericError Text String- deriving (Show, Typeable)+ deriving (Show) instance Exception YesodOAuth2Exception
src/Yesod/Auth/OAuth2/GitHub.hs view
@@ -61,7 +61,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://github.com/login/oauth/authorize" `withQuery` [scopeParam "," scopes]
src/Yesod/Auth/OAuth2/GitLab.hs view
@@ -53,7 +53,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = host `withPath` "/oauth/authorize" `withQuery` [scopeParam " " scopes] , oauth2TokenEndpoint = host `withPath` "/oauth/token"
src/Yesod/Auth/OAuth2/Google.hs view
@@ -80,7 +80,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://accounts.google.com/o/oauth2/auth" `withQuery` [scopeParam " " scopes]
src/Yesod/Auth/OAuth2/Nylas.hs view
@@ -55,7 +55,7 @@ oauth = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://api.nylas.com/oauth/authorize" `withQuery` [ ("response_type", "code")
src/Yesod/Auth/OAuth2/ORCID.hs view
@@ -41,7 +41,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://orcid.org/oauth/authorize" `withQuery` [scopeParam " " ["openid"]]
src/Yesod/Auth/OAuth2/Prelude.hs view
@@ -30,7 +30,12 @@ -- * OAuth2 , OAuth2 (..)- , OAuth2Token (..)+ , TokenResponse+ , accessToken+ , refreshToken+ , expiresIn+ , tokenType+ , idToken , AccessToken (..) , RefreshToken (..) @@ -78,7 +83,7 @@ :: FromJSON a => Text -> Manager- -> OAuth2Token+ -> TokenResponse -> URI -> IO (a, BL.ByteString) authGetProfile name manager token url = do@@ -114,7 +119,7 @@ -- May set the following keys: -- -- - @refreshToken@: if the provider supports refreshing the @accessToken@-setExtra :: OAuth2Token -> BL.ByteString -> [(Text, Text)]+setExtra :: TokenResponse -> BL.ByteString -> [(Text, Text)] setExtra token userResponse = [ ("accessToken", atoken $ accessToken token) , ("userResponse", decodeUtf8 $ BL.toStrict userResponse)
src/Yesod/Auth/OAuth2/Salesforce.hs view
@@ -76,7 +76,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = authorizeUri `withQuery` [scopeParam " " scopes] , oauth2TokenEndpoint = tokenUri , oauth2RedirectUri = Nothing
src/Yesod/Auth/OAuth2/Slack.hs view
@@ -74,7 +74,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://slack.com/oauth/authorize" `withQuery` [scopeParam "," $ map scopeText scopes]
src/Yesod/Auth/OAuth2/Spotify.hs view
@@ -37,7 +37,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://accounts.spotify.com/authorize" `withQuery` [scopeParam " " scopes]
src/Yesod/Auth/OAuth2/Twitch.hs view
@@ -49,7 +49,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://id.twitch.tv/oauth2/authorize" `withQuery` [scopeParam " " scopes]
src/Yesod/Auth/OAuth2/Upcase.hs view
@@ -44,7 +44,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "http://upcase.com/oauth/authorize" , oauth2TokenEndpoint = "http://upcase.com/oauth/token" , oauth2RedirectUri = Nothing
src/Yesod/Auth/OAuth2/WordPressDotCom.hs view
@@ -41,7 +41,7 @@ oauth2 = OAuth2 { oauth2ClientId = clientId- , oauth2ClientSecret = Just clientSecret+ , oauth2ClientSecret = clientSecret , oauth2AuthorizeEndpoint = "https://public-api.wordpress.com/oauth2/authorize" `withQuery` [scopeParam "," ["auth"]]
yesod-auth-oauth2.cabal view
@@ -1,6 +1,6 @@ cabal-version: 1.18 name: yesod-auth-oauth2-version: 0.7.4.0+version: 0.8.0.0 license: MIT license-file: LICENSE maintainer: engineering@freckle.com@@ -68,20 +68,20 @@ aeson >=0.6, base >=4.9.0.0 && <5, bytestring >=0.9.1.4,- crypton >=1.0.0,+ crypton >=0.32, errors >=2.3.0,- hoauth2 >=1.11.0,+ hoauth2 >=2.8.0, http-client >=0.4.0, http-conduit >=2.0, http-types >=0.8,- memory >=0.15.0,- microlens >=0.4.11.2,+ memory >=0.18.0,+ microlens >=0.4.13.1, mtl >=2.2.2,- safe-exceptions >=0.1.7.1,+ safe-exceptions >=0.1.7.4, text >=0.7, transformers >=0.5.6.2,- unliftio >=0.2.13.1,- uri-bytestring >=0.3.3.0,+ unliftio >=0.2.25.0,+ uri-bytestring >=0.3.3.1, yesod-auth >=1.6.0, yesod-core >=1.6.0 @@ -93,15 +93,15 @@ ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N build-depends: aeson >=0.6,- aeson-pretty >=0.8.8,+ aeson-pretty >=0.8.9, base >=4.9.0.0 && <5, bytestring >=0.9.1.4, containers >=0.6.0.1, http-conduit >=2.0, load-env >=0.2.1.0, text >=0.7,- warp >=3.3.13,- yesod >=1.6.1.0,+ warp >=3.3.25,+ yesod >=1.6.2.1, yesod-auth >=1.6.0, yesod-auth-oauth2 @@ -120,6 +120,6 @@ ghc-options: -Wall build-depends: base >=4.9.0.0 && <5,- hspec >=2.7.6,- uri-bytestring >=0.3.3.0,+ hspec >=2.10.10,+ uri-bytestring >=0.3.3.1, yesod-auth-oauth2