yesod-auth-oauth2 0.5.0.0 → 0.5.1.0
raw patch · 8 files changed
+148/−56 lines, 8 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- Yesod.Auth.OAuth2.Github: instance Data.Aeson.Types.FromJSON.FromJSON Yesod.Auth.OAuth2.Github.User
+ URI.ByteString.Extension: withPath :: URIRef a -> ByteString -> URIRef a
+ Yesod.Auth.OAuth2: getRefreshToken :: Creds m -> Maybe RefreshToken
+ Yesod.Auth.OAuth2.GitHub: instance Data.Aeson.Types.FromJSON.FromJSON Yesod.Auth.OAuth2.GitHub.User
+ Yesod.Auth.OAuth2.GitHub: oauth2GitHub :: YesodAuth m => Text -> Text -> AuthPlugin m
+ Yesod.Auth.OAuth2.GitHub: oauth2GitHubScoped :: YesodAuth m => [Text] -> Text -> Text -> AuthPlugin m
+ Yesod.Auth.OAuth2.GitLab: defaultHost :: URI
+ Yesod.Auth.OAuth2.GitLab: defaultScopes :: [Text]
+ Yesod.Auth.OAuth2.GitLab: instance Data.Aeson.Types.FromJSON.FromJSON Yesod.Auth.OAuth2.GitLab.User
+ Yesod.Auth.OAuth2.GitLab: oauth2GitLab :: YesodAuth m => Text -> Text -> AuthPlugin m
+ Yesod.Auth.OAuth2.GitLab: oauth2GitLabHostScopes :: YesodAuth m => URI -> [Text] -> Text -> Text -> AuthPlugin m
- 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: data OAuth2 :: *
+ Yesod.Auth.OAuth2: data OAuth2
- Yesod.Auth.OAuth2: data OAuth2Token :: *
+ Yesod.Auth.OAuth2: data OAuth2Token
- Yesod.Auth.OAuth2.Prelude: (.=) :: KeyValue kv => forall v. ToJSON v => Text -> v -> kv
+ Yesod.Auth.OAuth2.Prelude: (.=) :: (KeyValue kv, ToJSON v) => Text -> v -> kv
- Yesod.Auth.OAuth2.Prelude: AuthPlugin :: Text -> (Method -> [Piece] -> AuthHandler master TypedContent) -> ((Route Auth -> Route master) -> WidgetFor master ()) -> AuthPlugin master
+ Yesod.Auth.OAuth2.Prelude: AuthPlugin :: Text -> Method -> [Piece] -> AuthHandler master TypedContent -> Route Auth -> Route master -> WidgetFor master () -> AuthPlugin master
- Yesod.Auth.OAuth2.Prelude: [apLogin] :: AuthPlugin master -> (Route Auth -> Route master) -> WidgetFor master ()
+ Yesod.Auth.OAuth2.Prelude: [apLogin] :: AuthPlugin master -> Route Auth -> Route master -> WidgetFor master ()
- Yesod.Auth.OAuth2.Prelude: authHttpManager :: (YesodAuth master, MonadHandler m, (~) * HandlerSite m master) => m Manager
+ Yesod.Auth.OAuth2.Prelude: authHttpManager :: (YesodAuth master, MonadHandler m, HandlerSite m ~ master) => m Manager
- Yesod.Auth.OAuth2.Prelude: authLayout :: (YesodAuth master, MonadHandler m, (~) * HandlerSite m master) => WidgetFor master () -> m Html
+ Yesod.Auth.OAuth2.Prelude: authLayout :: (YesodAuth master, MonadHandler m, HandlerSite m ~ master) => WidgetFor master () -> m Html
- Yesod.Auth.OAuth2.Prelude: authenticate :: (YesodAuth master, MonadHandler m, (~) * HandlerSite m master) => Creds master -> m AuthenticationResult master
+ Yesod.Auth.OAuth2.Prelude: authenticate :: (YesodAuth master, MonadHandler m, HandlerSite m ~ master) => Creds master -> m AuthenticationResult master
- 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 OAuth2 :: *
+ Yesod.Auth.OAuth2.Prelude: data OAuth2
- Yesod.Auth.OAuth2.Prelude: data OAuth2Token :: *
+ Yesod.Auth.OAuth2.Prelude: data OAuth2Token
- Yesod.Auth.OAuth2.Prelude: data Text :: *
+ Yesod.Auth.OAuth2.Prelude: data Text
- Yesod.Auth.OAuth2.Prelude: getAuthId :: (YesodAuth master, MonadHandler m, (~) * HandlerSite m master) => Creds master -> m Maybe AuthId master
+ Yesod.Auth.OAuth2.Prelude: getAuthId :: (YesodAuth master, MonadHandler m, HandlerSite m ~ master) => Creds master -> m Maybe AuthId master
- Yesod.Auth.OAuth2.Prelude: maybeAuthId :: (YesodAuth master, MonadHandler m, (~) * master HandlerSite m) => m Maybe AuthId master
+ Yesod.Auth.OAuth2.Prelude: maybeAuthId :: (YesodAuth master, MonadHandler m, master ~ HandlerSite m) => m Maybe AuthId master
- 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: onErrorHtml :: (YesodAuth master, MonadHandler m, (~) * HandlerSite m master) => Route master -> Text -> m Html
+ Yesod.Auth.OAuth2.Prelude: onErrorHtml :: (YesodAuth master, MonadHandler m, HandlerSite m ~ master) => Route master -> Text -> m Html
- Yesod.Auth.OAuth2.Prelude: onLogin :: (YesodAuth master, MonadHandler m, (~) * master HandlerSite m) => m ()
+ Yesod.Auth.OAuth2.Prelude: onLogin :: (YesodAuth master, MonadHandler m, master ~ HandlerSite m) => m ()
- Yesod.Auth.OAuth2.Prelude: onLogout :: (YesodAuth master, MonadHandler m, (~) * master HandlerSite m) => m ()
+ Yesod.Auth.OAuth2.Prelude: onLogout :: (YesodAuth master, MonadHandler m, master ~ HandlerSite m) => m ()
- Yesod.Auth.OAuth2.Prelude: runHttpRequest :: (YesodAuth master, MonadHandler m, (~) * HandlerSite m master, MonadUnliftIO m) => Request -> (Response BodyReader -> m a) -> m a
+ Yesod.Auth.OAuth2.Prelude: runHttpRequest :: (YesodAuth master, MonadHandler m, HandlerSite m ~ master, MonadUnliftIO m) => Request -> Response BodyReader -> m a -> m a
- Yesod.Auth.OAuth2.Prelude: withObject :: () => String -> (Object -> Parser a) -> Value -> Parser a
+ Yesod.Auth.OAuth2.Prelude: withObject :: () => String -> Object -> Parser a -> Value -> Parser a
Files
- example/Main.hs +4/−2
- src/URI/ByteString/Extension.hs +3/−0
- src/Yesod/Auth/OAuth2.hs +12/−7
- src/Yesod/Auth/OAuth2/GitHub.hs +53/−0
- src/Yesod/Auth/OAuth2/GitLab.hs +60/−0
- src/Yesod/Auth/OAuth2/Github.hs +5/−43
- src/Yesod/Auth/OAuth2/Prelude.hs +6/−1
- yesod-auth-oauth2.cabal +5/−3
example/Main.hs view
@@ -39,7 +39,8 @@ import Yesod.Auth.OAuth2.BattleNet import Yesod.Auth.OAuth2.Bitbucket import Yesod.Auth.OAuth2.EveOnline-import Yesod.Auth.OAuth2.Github+import Yesod.Auth.OAuth2.GitHub+import Yesod.Auth.OAuth2.GitLab import Yesod.Auth.OAuth2.Google import Yesod.Auth.OAuth2.Nylas import Yesod.Auth.OAuth2.Salesforce@@ -134,7 +135,8 @@ [ loadPlugin (oauth2BattleNet [whamlet|TODO|] "en") "BATTLE_NET" , loadPlugin oauth2Bitbucket "BITBUCKET" , loadPlugin (oauth2Eve Plain) "EVE_ONLINE"- , loadPlugin oauth2Github "GITHUB"+ , loadPlugin oauth2GitHub "GITHUB"+ , loadPlugin oauth2GitLab "GITLAB" , loadPlugin oauth2Google "GOOGLE" , loadPlugin oauth2Nylas "NYLAS" , loadPlugin oauth2Salesforce "SALES_FORCE"
src/URI/ByteString/Extension.hs view
@@ -49,5 +49,8 @@ (Just $ Authority Nothing h Nothing) (\a -> Just $ a & authorityHostL .~ h) +withPath :: URIRef a -> ByteString -> URIRef a+withPath u p = u & pathL .~ p+ withQuery :: URIRef a -> [(ByteString, ByteString)] -> URIRef a withQuery u q = u & (queryL . queryPairsL) %~ (++ q)
src/Yesod/Auth/OAuth2.hs view
@@ -19,6 +19,7 @@ -- * Reading our @'credsExtra'@ keys , getAccessToken+ , getRefreshToken , getUserResponse , getUserResponseJSON ) where@@ -62,21 +63,25 @@ where login tm = [whamlet|<a href=@{tm $ oauth2Url name}>^{widget}|] --- | Read from the values set via @'setExtra'@+-- | Read the @'AccessToken'@ from the values set via @'setExtra'@ getAccessToken :: Creds m -> Maybe AccessToken getAccessToken = (AccessToken <$>) . lookup "accessToken" . credsExtra --- | Read from the values set via @'setExtra'@+-- | 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 = (fromStrict . encodeUtf8 <$>) . lookup "userResponse" . credsExtra --- | Read from the values set via @'setExtra'@, decode as JSON------ This is unsafe if the key is missing, but safe with respect to parsing--- errors.---+-- | @'getUserResponse'@, and decode as JSON getUserResponseJSON :: FromJSON a => Creds m -> Either String a getUserResponseJSON = eitherDecode <=< note "userResponse key not present" . getUserResponse
+ src/Yesod/Auth/OAuth2/GitHub.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE OverloadedStrings #-}+-- |+--+-- OAuth2 plugin for http://github.com+--+-- * Authenticates against github+-- * Uses github user id as credentials identifier+--+module Yesod.Auth.OAuth2.GitHub+ ( oauth2GitHub+ , oauth2GitHubScoped+ ) where++import Yesod.Auth.OAuth2.Prelude++import qualified Data.Text as T++newtype User = User Int++instance FromJSON User where+ parseJSON = withObject "User" $ \o -> User+ <$> o .: "id"++pluginName :: Text+pluginName = "github"++defaultScopes :: [Text]+defaultScopes = ["user:email"]++oauth2GitHub :: YesodAuth m => Text -> Text -> AuthPlugin m+oauth2GitHub = oauth2GitHubScoped defaultScopes++oauth2GitHubScoped :: YesodAuth m => [Text] -> Text -> Text -> AuthPlugin m+oauth2GitHubScoped scopes clientId clientSecret =+ authOAuth2 pluginName oauth2 $ \manager token -> do+ (User userId, userResponse) <-+ authGetProfile pluginName manager token "https://api.github.com/user"++ pure Creds+ { credsPlugin = pluginName+ , credsIdent = T.pack $ show userId+ , credsExtra = setExtra token userResponse+ }+ where+ oauth2 = OAuth2+ { oauthClientId = clientId+ , oauthClientSecret = clientSecret+ , oauthOAuthorizeEndpoint = "https://github.com/login/oauth/authorize" `withQuery`+ [ scopeParam "," scopes+ ]+ , oauthAccessTokenEndpoint = "https://github.com/login/oauth/access_token"+ , oauthCallback = Nothing+ }
+ src/Yesod/Auth/OAuth2/GitLab.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE OverloadedStrings #-}+module Yesod.Auth.OAuth2.GitLab+ ( oauth2GitLab+ , oauth2GitLabHostScopes+ , defaultHost+ , defaultScopes+ ) where++import Yesod.Auth.OAuth2.Prelude++import qualified Data.Text as T++newtype User = User Int++instance FromJSON User where+ parseJSON = withObject "User" $ \o -> User+ <$> o .: "id"++pluginName :: Text+pluginName = "gitlab"++defaultHost :: URI+defaultHost = "https://gitlab.com"++defaultScopes :: [Text]+defaultScopes = ["read_user"]++-- | Authorize with @gitlab.com@ and @[\"read_user\"]@+--+-- To customize either of these values, use @'oauth2GitLabHostScopes'@ and pass+-- the default for the argument not being customized. Note that we require at+-- least @read_user@, so we can request the credentials identifier.+--+-- > oauth2GitLabHostScopes defaultHost ["api", "read_user"]+-- > oauth2GitLabHostScopes "https://gitlab.example.com" defaultScopes+--+oauth2GitLab :: YesodAuth m => Text -> Text -> AuthPlugin m+oauth2GitLab = oauth2GitLabHostScopes defaultHost defaultScopes++oauth2GitLabHostScopes :: YesodAuth m => URI -> [Text] -> Text -> Text -> AuthPlugin m+oauth2GitLabHostScopes host scopes clientId clientSecret =+ authOAuth2 pluginName oauth2 $ \manager token -> do+ (User userId, userResponse) <- authGetProfile pluginName manager token+ $ host `withPath` "/api/v4/user"++ pure Creds+ { credsPlugin = pluginName+ , credsIdent = T.pack $ show userId+ , credsExtra = setExtra token userResponse+ }+ where+ oauth2 = OAuth2+ { oauthClientId = clientId+ , oauthClientSecret = clientSecret+ , oauthOAuthorizeEndpoint = host+ `withPath` "/oauth/authorize"+ `withQuery` [ scopeParam " " scopes ]+ , oauthAccessTokenEndpoint = host `withPath` "/oauth/token"+ , oauthCallback = Nothing+ }
src/Yesod/Auth/OAuth2/Github.hs view
@@ -1,53 +1,15 @@-{-# LANGUAGE OverloadedStrings #-}--- |------ OAuth2 plugin for http://github.com------ * Authenticates against github--- * Uses github user id as credentials identifier--- module Yesod.Auth.OAuth2.Github+ {-# DEPRECATED "Please use Yesod.Auth.OAuth2.GitHub (GitHub, not Github)" #-} ( oauth2Github , oauth2GithubScoped ) where -import Yesod.Auth.OAuth2.Prelude -import qualified Data.Text as T--newtype User = User Int--instance FromJSON User where- parseJSON = withObject "User" $ \o -> User- <$> o .: "id"--pluginName :: Text-pluginName = "github"--defaultScopes :: [Text]-defaultScopes = ["user:email"]+import Yesod.Auth.OAuth2.GitHub+import Yesod.Auth.OAuth2.Prelude oauth2Github :: YesodAuth m => Text -> Text -> AuthPlugin m-oauth2Github = oauth2GithubScoped defaultScopes+oauth2Github = oauth2GitHub oauth2GithubScoped :: YesodAuth m => [Text] -> Text -> Text -> AuthPlugin m-oauth2GithubScoped scopes clientId clientSecret =- authOAuth2 pluginName oauth2 $ \manager token -> do- (User userId, userResponse) <-- authGetProfile pluginName manager token "https://api.github.com/user"-- pure Creds- { credsPlugin = pluginName- , credsIdent = T.pack $ show userId- , credsExtra = setExtra token userResponse- }- where- oauth2 = OAuth2- { oauthClientId = clientId- , oauthClientSecret = clientSecret- , oauthOAuthorizeEndpoint = "https://github.com/login/oauth/authorize" `withQuery`- [ scopeParam "," scopes- ]- , oauthAccessTokenEndpoint = "https://github.com/login/oauth/access_token"- , oauthCallback = Nothing- }+oauth2GithubScoped = oauth2GitHubScoped
src/Yesod/Auth/OAuth2/Prelude.hs view
@@ -114,13 +114,18 @@ -- | 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)
yesod-auth-oauth2.cabal view
@@ -1,11 +1,11 @@--- This file has been generated from package.yaml by hpack version 0.20.0.+-- This file has been generated from package.yaml by hpack version 0.28.2. -- -- see: https://github.com/sol/hpack ----- hash: 8ca8256c419d63fec8925743afe833bfa510d57bf4c9c3f50707f07ad619058a+-- hash: d660ecb1d27952349257ee5fad10d3bef5734b4e11646d20bec923fd77b1ae62 name: yesod-auth-oauth2-version: 0.5.0.0+version: 0.5.1.0 synopsis: OAuth 2.0 authentication plugins description: Library to authenticate with OAuth 2.0 for Yesod web applications. category: Web@@ -55,7 +55,9 @@ Yesod.Auth.OAuth2.Dispatch Yesod.Auth.OAuth2.ErrorResponse Yesod.Auth.OAuth2.EveOnline+ Yesod.Auth.OAuth2.GitHub Yesod.Auth.OAuth2.Github+ Yesod.Auth.OAuth2.GitLab Yesod.Auth.OAuth2.Google Yesod.Auth.OAuth2.Nylas Yesod.Auth.OAuth2.Prelude