{-# LANGUAGE QuasiQuotes #-} module Network.OAuth2.Provider.Weibo where import Data.Aeson import Data.Map.Strict qualified as Map import Data.Set qualified as Set import Data.Text.Lazy (Text) import GHC.Generics import Network.OAuth.OAuth2 import Network.OAuth2.Experiment import URI.ByteString.QQ data Weibo = Weibo deriving (Eq, Show) type instance IdpUserInfo Weibo = WeiboUID defaultWeiboApp :: IdpApplication 'AuthorizationCode Weibo defaultWeiboApp = AuthorizationCodeIdpApplication { idpAppName = "default-weibo-App" , idpAppClientId = "" , idpAppClientSecret = "" , idpAppScope = Set.empty , idpAppAuthorizeState = "CHANGE_ME" , idpAppAuthorizeExtraParams = Map.empty , idpAppRedirectUri = [uri|http://localhost|] , idpAppTokenRequestAuthenticationMethod = ClientSecretBasic , idp = defaultWeiboIdp } defaultWeiboIdp :: Idp Weibo defaultWeiboIdp = Idp { idpFetchUserInfo = authGetJSONWithAuthMethod @_ @(IdpUserInfo Weibo) AuthInRequestQuery , idpUserInfoEndpoint = [uri|https://api.weibo.com/2/account/get_uid.json|] , idpAuthorizeEndpoint = [uri|https://api.weibo.com/oauth2/authorize|] , idpTokenEndpoint = [uri|https://api.weibo.com/oauth2/access_token|] } -- | http://open.weibo.com/wiki/2/users/show data WeiboUser = WeiboUser { id :: Integer , name :: Text , screenName :: Text } deriving (Show, Generic) newtype WeiboUID = WeiboUID {uid :: Integer} deriving (Show, Generic) instance FromJSON WeiboUID instance FromJSON WeiboUser where parseJSON = genericParseJSON defaultOptions {fieldLabelModifier = camelTo2 '_'}