yesod-auth-oauth2/Yesod/Auth/OAuth2/Twitter.hs
patrick brisbin 7e61f24c4b
Add Twitter as provider
- Extract generic OAuth2Plugin construct
- Define Twitter in terms of it
- Will re-implement Upcase, GitHub, etc in terms of it separately
2015-04-08 11:21:27 -04:00

50 lines
1.3 KiB
Haskell

{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
module Yesod.Auth.OAuth2.Twitter
( oauth2Twitter
, module Yesod.Auth.OAuth2
) where
#if __GLASGOW_HASKELL__ < 710
import Control.Applicative ((<$>), (<*>))
#endif
import Control.Monad (mzero)
import Data.Aeson
import Data.Text (Text)
import Yesod.Auth
import Yesod.Auth.OAuth2
data TwitterUser = TwitterUser
{ twitterUserId :: Text
, twitterUserName :: Text
, twitterScreenName :: Text
}
instance FromJSON TwitterUser where
parseJSON (Object o) = TwitterUser
<$> o .: "id_str"
<*> o .: "name"
<*> o .: "screen_name"
parseJSON _ = mzero
oauth2Twitter :: YesodAuth m => Text -> Text -> AuthPlugin m
oauth2Twitter = oauth2Plugin OAuth2Plugin
{ oapName = "twitter"
, oapAuthEndpoint = "https://api.twitter.com/oauth/authorize"
, oapTokenEndpoint = "https://api.twitter.com/oauth/access_token"
, oapFetchProfile = fetchProfile
, oapToCredsIdent = twitterUserId
, oapToCredsExtra = toCredsExtra
}
where
fetchProfile manager token = authGetJSON manager token
"https://api.twitter.com/1.1/account/verify_credentials.json"
toCredsExtra user =
[ ("name", twitterUserName user)
, ("screen_name", twitterScreenName user)
]