{-# LANGUAGE OverloadedStrings #-} module Yesod.Auth.OAuth2.ClassLink ( oauth2ClassLink , oauth2ClassLinkScoped ) where import Yesod.Auth.OAuth2.Prelude import qualified Data.Text as T newtype User = User Int instance FromJSON User where parseJSON :: Value -> Parser User parseJSON = forall a. String -> (Object -> Parser a) -> Value -> Parser a withObject String "User" forall a b. (a -> b) -> a -> b $ \Object o -> Int -> User User forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Object o forall a. FromJSON a => Object -> Key -> Parser a .: Key "UserId" pluginName :: Text pluginName :: Text pluginName = Text "classlink" defaultScopes :: [Text] defaultScopes :: [Text] defaultScopes = [Text "profile", Text "oneroster"] oauth2ClassLink :: YesodAuth m => Text -> Text -> AuthPlugin m oauth2ClassLink :: forall m. YesodAuth m => Text -> Text -> AuthPlugin m oauth2ClassLink = forall m. YesodAuth m => [Text] -> Text -> Text -> AuthPlugin m oauth2ClassLinkScoped [Text] defaultScopes oauth2ClassLinkScoped :: YesodAuth m => [Text] -> Text -> Text -> AuthPlugin m oauth2ClassLinkScoped :: forall m. YesodAuth m => [Text] -> Text -> Text -> AuthPlugin m oauth2ClassLinkScoped [Text] scopes Text clientId Text clientSecret = forall m. YesodAuth m => Text -> OAuth2 -> FetchCreds m -> AuthPlugin m authOAuth2 Text pluginName OAuth2 oauth2 forall a b. (a -> b) -> a -> b $ \Manager manager OAuth2Token token -> do (User Int userId, ByteString userResponse) <- forall a. FromJSON a => Text -> Manager -> OAuth2Token -> URI -> IO (a, ByteString) authGetProfile Text pluginName Manager manager OAuth2Token token URI "https://nodeapi.classlink.com/v2/my/info" forall (f :: * -> *) a. Applicative f => a -> f a pure Creds { credsPlugin :: Text credsPlugin = Text pluginName , credsIdent :: Text credsIdent = String -> Text T.pack forall a b. (a -> b) -> a -> b $ forall a. Show a => a -> String show Int userId , credsExtra :: [(Text, Text)] credsExtra = OAuth2Token -> ByteString -> [(Text, Text)] setExtra OAuth2Token token ByteString userResponse } where oauth2 :: OAuth2 oauth2 = OAuth2 { oauth2ClientId :: Text oauth2ClientId = Text clientId , oauth2ClientSecret :: Maybe Text oauth2ClientSecret = forall a. a -> Maybe a Just Text clientSecret , oauth2AuthorizeEndpoint :: URI oauth2AuthorizeEndpoint = URI "https://launchpad.classlink.com/oauth2/v2/auth" forall a. URIRef a -> [(ByteString, ByteString)] -> URIRef a `withQuery` [Text -> [Text] -> (ByteString, ByteString) scopeParam Text "," [Text] scopes] , oauth2TokenEndpoint :: URI oauth2TokenEndpoint = URI "https://launchpad.classlink.com/oauth2/v2/token" , oauth2RedirectUri :: Maybe URI oauth2RedirectUri = forall a. Maybe a Nothing }