mirror of
https://github.com/freckle/yesod-auth-oauth2.git
synced 2026-09-10 19:34:56 +02:00
- Extract generic OAuth2Plugin construct - Define Twitter in terms of it - Will re-implement Upcase, GitHub, etc in terms of it separately
50 lines
1.3 KiB
Haskell
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)
|
|
]
|