diff --git a/yesod-auth/Yesod/Auth/BrowserId.hs b/yesod-auth/Yesod/Auth/BrowserId.hs index be847acf..4fcfea84 100644 --- a/yesod-auth/Yesod/Auth/BrowserId.hs +++ b/yesod-auth/Yesod/Auth/BrowserId.hs @@ -13,7 +13,11 @@ import Text.Hamlet (hamlet) import qualified Data.Text as T import Data.Maybe (fromMaybe) import Control.Monad.IO.Class (liftIO) +import Control.Monad (when) import Control.Exception (throwIO) +import Text.Julius (julius, rawJS) +import Data.Aeson (toJSON) +import Network.URI (uriPath, parseURI) pid :: Text pid = "browserid" @@ -61,12 +65,41 @@ helper maudience = AuthPlugin _ -> notFound , apLogin = \toMaster -> do addScriptRemote browserIdJs + onclick <- lift newIdent + render <- lift getUrlRender + let login = toJSON $ getPath $ render (toMaster LoginR) + toWidget [julius| +function #{rawJS onclick}() { + navigator.id.watch({ + onlogin: function (assertion) { + if (assertion) { + alert("@{toMaster complete}/" + assertion); + document.location = "@{toMaster complete}/" + assertion; + } + }, + onlogout: function () {} + }); + navigator.id.request({ + returnTo: #{login} + "?autologin=true" + }); +} +|] + + autologin <- fmap (== Just "true") $ lift $ lookupGetParam "autologin" + when autologin $ toWidget [julius| +#{rawJS onclick}(); +|] + toWidget [hamlet| $newline never
-
+
|]
}
where
stripScheme t = fromMaybe t $ T.stripPrefix "//" $ snd $ T.breakOn "//" t
+
+ getPath t = fromMaybe t $ do
+ uri <- parseURI $ T.unpack t
+ return $ T.pack $ uriPath uri
diff --git a/yesod-auth/browserid.hs b/yesod-auth/browserid.hs
index bd789a81..8a768298 100644
--- a/yesod-auth/browserid.hs
+++ b/yesod-auth/browserid.hs
@@ -13,6 +13,7 @@ import Yesod.Form
import Network.Wai.Handler.Warp (run)
import Network.HTTP.Conduit
import Network.TLS
+import Network.Wai.Middleware.RequestLogger
data BID = BID { httpManager :: Manager }
@@ -49,6 +50,4 @@ instance RenderMessage BID FormMessage where
main :: IO ()
main = do
m <- newManager def
- { managerCheckCerts = \_ _ -> return CertificateUsageAccept
- }
- toWaiApp (BID m) >>= run 3000
+ toWaiApp (BID m) >>= run 3000 . logStdoutDev
diff --git a/yesod-auth/yesod-auth.cabal b/yesod-auth/yesod-auth.cabal
index 2809c4f5..0fd856fd 100644
--- a/yesod-auth/yesod-auth.cabal
+++ b/yesod-auth/yesod-auth.cabal
@@ -26,6 +26,7 @@ library
, yesod-persistent >= 1.1 && < 1.2
, hamlet >= 1.1 && < 1.2
, shakespeare-css >= 1.0 && < 1.1
+ , shakespeare-js >= 1.0.2 && < 1.2
, yesod-json >= 1.1 && < 1.2
, containers
, unordered-containers
@@ -40,6 +41,7 @@ library
, lifted-base >= 0.1
, blaze-html >= 0.5 && < 0.6
, blaze-markup >= 0.5.1 && < 0.6
+ , network
exposed-modules: Yesod.Auth
Yesod.Auth.BrowserId