packages feed

snaplet-oauth-0.0.6: src/Snap/Snaplet/OAuth/Google.hs

{-# LANGUAGE CPP               #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes        #-}

module Snap.Snaplet.OAuth.Google
       (
         -- * Routes
         routes
         -- * Handlers
       , googleLoginH
       , googleCallbackH
       , googleUserH
         -- * Types and API
       , module Snap.Snaplet.OAuth.Google.Api
       ) where

------------------------------------------------------------------------------
import           Control.Category
import           Data.ByteString                      (ByteString)
import qualified Data.ByteString                      as BS
import           Data.Maybe
import           Network.HTTP.Types                   (renderSimpleQuery)
import           Prelude                              hiding ((.))
import           Snap

import           Snap.Snaplet.OAuth.Google.Api
import           Snap.Snaplet.OAuth.Internal.Handlers
import           Snap.Snaplet.OAuth.Internal.Types

------------------------------------------------------------------------------
--              Google
------------------------------------------------------------------------------

-- |
googleLoginH :: HasOAuth b => Handler b v ()
googleLoginH = loginWithOauthH google scopeParam
  where scopeParam = Just $ renderSimpleQuery False scopeQuery
        scopeQuery = [(googleScopeKey, BS.intercalate " " scopes)]
        -- | multiple scope in order to get email info
        scopes = [googleScopeEmail, googleScopeUserInfo]


googleCallbackH :: HasOAuth b => Handler b v OAuthValue
googleCallbackH = oauthCallbackH google


googleUserH :: HasOAuth b => Handler b v (Maybe GoogleUser)
googleUserH = googleCallbackH
              >>= liftIO . userInfo

------------------------------------------------------------------------------

-- | The application's routes.
--
routes :: HasOAuth b => [(ByteString, Handler b v ())]
routes  = [ ("/google", googleLoginH)
          ]