From 98b9f1108d67028afb6fd3f101768683e1baadd0 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Sat, 27 Jan 2018 10:31:54 -0500 Subject: [PATCH] Remove extra information from EveOnline provider Removed keys: - charName - charId - tokenType - expires All can be recovered by re-parsing userResponseJSON. --- src/Yesod/Auth/OAuth2/EveOnline.hs | 98 +++++++++++------------------- 1 file changed, 37 insertions(+), 61 deletions(-) diff --git a/src/Yesod/Auth/OAuth2/EveOnline.hs b/src/Yesod/Auth/OAuth2/EveOnline.hs index c4b3449..56c1bff 100644 --- a/src/Yesod/Auth/OAuth2/EveOnline.hs +++ b/src/Yesod/Auth/OAuth2/EveOnline.hs @@ -6,7 +6,6 @@ -- -- * Authenticates against eveonline -- * Uses EVEs unique account-user-char-hash as credentials identifier --- * Returns charName, charId, tokenType, accessToken and expires as extras -- module Yesod.Auth.OAuth2.EveOnline ( oauth2Eve @@ -16,9 +15,16 @@ module Yesod.Auth.OAuth2.EveOnline import Yesod.Auth.OAuth2.Prelude +import qualified Data.ByteString.Lazy as BL import qualified Data.Text as T import Yesod.Core.Widget +newtype User = User Text + +instance FromJSON User where + parseJSON = withObject "User" $ \o -> User + <$> o .: "CharacterOwnerHash" + data WidgetType m = Plain -- ^ Simple "Login via eveonline" text | BigWhite @@ -27,49 +33,40 @@ data WidgetType m | SmallBlack | Custom (WidgetT m IO ()) -data EveUser = EveUser - { eveUserName :: Text - , eveUserExpire :: Text - , eveTokenType :: Text - , eveCharOwnerHash :: Text - , eveCharId :: Integer - } +asWidget :: YesodAuth m => WidgetType m -> WidgetT m IO () +asWidget Plain = [whamlet|Login via eveonline|] +asWidget BigWhite = [whamlet||] +asWidget BigBlack = [whamlet||] +asWidget SmallWhite = [whamlet||] +asWidget SmallBlack = [whamlet||] +asWidget (Custom a) = a -instance FromJSON EveUser where - parseJSON = withObject "EveUser" $ \o -> EveUser - <$> o .: "CharacterName" - <*> o .: "ExpiresOn" - <*> o .: "TokenType" - <*> o .: "CharacterOwnerHash" - <*> o .: "CharacterID" +pluginName :: Text +pluginName = "eveonline" -oauth2Eve :: YesodAuth m - => Text -- ^ Client ID - -> Text -- ^ Client Secret - -> WidgetType m - -> AuthPlugin m -oauth2Eve clientId clientSecret = oauth2EveScoped clientId clientSecret ["publicData"] . asWidget +defaultScopes :: [Text] +defaultScopes = ["publicData"] +oauth2Eve :: YesodAuth m => WidgetType m -> Text -> Text -> AuthPlugin m +oauth2Eve = oauth2EveScoped defaultScopes + +oauth2EveScoped :: YesodAuth m => [Text] -> WidgetType m -> Text -> Text -> AuthPlugin m +oauth2EveScoped scopes widgetType clientId clientSecret = + authOAuth2Widget (asWidget widgetType) pluginName oauth2 $ \manager token -> do + (User userId, userResponseJSON) <- + authGetProfile pluginName manager token "https://login.eveonline.com/oauth/verify" + + pure Creds + { credsPlugin = "eveonline" + -- FIXME: Preserved bug. See similar comment in Bitbucket provider. + , credsIdent = T.pack $ show userId + , credsExtra = + [ ("accessToken", atoken $ accessToken token) + , ("userResponseJSON", decodeUtf8 $ BL.toStrict userResponseJSON) + ] + } where - asWidget :: YesodAuth m => WidgetType m -> WidgetT m IO () - asWidget Plain = [whamlet|Login via eveonline|] - asWidget BigWhite = [whamlet||] - asWidget BigBlack = [whamlet||] - asWidget SmallWhite = [whamlet||] - asWidget SmallBlack = [whamlet||] - asWidget (Custom a) = a - -oauth2EveScoped :: YesodAuth m - => Text -- ^ Client ID - -> Text -- ^ Client Secret - -> [Text] -- ^ List of scopes to request - -> WidgetT m IO () -- ^ Login widget - -> AuthPlugin m -oauth2EveScoped clientId clientSecret scopes widget = - authOAuth2Widget widget "eveonline" oauth fetchEveProfile - - where - oauth = OAuth2 + oauth2 = OAuth2 { oauthClientId = clientId , oauthClientSecret = clientSecret , oauthOAuthorizeEndpoint = "https://login.eveonline.com/oauth/authorize" `withQuery` @@ -79,24 +76,3 @@ oauth2EveScoped clientId clientSecret scopes widget = , oauthAccessTokenEndpoint = "https://login.eveonline.com/oauth/token" , oauthCallback = Nothing } - -fetchEveProfile :: Manager -> OAuth2Token -> IO (Creds m) -fetchEveProfile manager token = do - userResult <- authGetJSON manager (accessToken token) "https://login.eveonline.com/oauth/verify" - - case userResult of - Right user -> return $ toCreds user token - Left err-> throwIO $ invalidProfileResponse "eveonline" err - -toCreds :: EveUser -> OAuth2Token -> Creds m -toCreds user token = Creds - { credsPlugin = "eveonline" - , credsIdent = T.pack $ show $ eveCharOwnerHash user - , credsExtra = - [ ("charName", eveUserName user) - , ("charId", T.pack . show . eveCharId $ user) - , ("tokenType", eveTokenType user) - , ("expires", eveUserExpire user) - , ("accessToken", atoken $ accessToken token) - ] - }