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)
- ]
- }