{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE FlexibleContexts #-} module Yesod.Auth.Rpxnow ( authRpxnow ) where import Yesod.Auth import qualified Web.Authenticate.Rpxnow as Rpxnow import Control.Monad (mplus) import Yesod.Handler import Yesod.Widget import Yesod.Request import Text.Hamlet (hamlet) import Data.Text (pack, unpack) import Data.Text.Encoding (encodeUtf8, decodeUtf8With) import Data.Text.Encoding.Error (lenientDecode) import Control.Arrow ((***)) import Network.HTTP.Types (renderQuery) authRpxnow :: YesodAuth m => String -- ^ app name -> String -- ^ key -> AuthPlugin m authRpxnow app apiKey = AuthPlugin "rpxnow" dispatch login where login :: forall sub master. ToWidget sub master (GWidget sub master ()) => (Route Auth -> Route master) -> GWidget sub master () login tm = do render <- lift getUrlRender let queryString = decodeUtf8With lenientDecode $ renderQuery True [("token_url", Just $ encodeUtf8 $ render $ tm $ PluginR "rpxnow" [])] toWidget [hamlet| $newline never