diff --git a/example/Main.hs b/example/Main.hs index 9c8d836..562bf31 100644 --- a/example/Main.hs +++ b/example/Main.hs @@ -40,6 +40,7 @@ import Yesod.Auth.OAuth2.Spotify import Yesod.Auth.OAuth2.Twitch import Yesod.Auth.OAuth2.Upcase import Yesod.Auth.OAuth2.WordPressDotCom +import Yesod.Auth.OAuth2.ORCID data App = App { appHttpManager :: Manager @@ -149,6 +150,7 @@ mkFoundation = do , loadPlugin (oauth2Spotify []) "SPOTIFY" , loadPlugin oauth2Twitch "TWITCH" , loadPlugin oauth2WordPressDotCom "WORDPRESS_DOT_COM" + , loadPlugin oauth2ORCID "ORCID" , loadPlugin oauth2Upcase "UPCASE" ] diff --git a/src/Yesod/Auth/OAuth2/ORCID.hs b/src/Yesod/Auth/OAuth2/ORCID.hs new file mode 100644 index 0000000..a60f394 --- /dev/null +++ b/src/Yesod/Auth/OAuth2/ORCID.hs @@ -0,0 +1,50 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Yesod.Auth.OAuth2.ORCID + ( oauth2ORCID + ) where + +import qualified Data.Text as T +import Yesod.Auth.OAuth2.Prelude + +pluginName :: Text +pluginName = "orcid" + +newtype User = User Text + +instance FromJSON User where + parseJSON = withObject "User" $ \o -> User <$> o .: "sub" + +oauth2ORCID + :: YesodAuth m + => Text + -- ^ Client Id + -> Text + -- ^ Client Secret + -> AuthPlugin m +oauth2ORCID clientId clientSecret = + authOAuth2 pluginName oauth2 $ \manager token -> do + (User userId, userResponse) <- + authGetProfile + pluginName + manager + token + "https://orcid.org/oauth/userinfo" + + pure + Creds + { credsPlugin = pluginName + , credsIdent = T.pack $ show userId + , credsExtra = setExtra token userResponse + } + where + oauth2 = + OAuth2 + { oauth2ClientId = clientId + , oauth2ClientSecret = Just clientSecret + , oauth2AuthorizeEndpoint = + "https://orcid.org/oauth/authorize" + `withQuery` [scopeParam " " ["openid"]] + , oauth2TokenEndpoint = "https://orcid.org/oauth/token" + , oauth2RedirectUri = Nothing + }