Use newer Mozilla Persona API (#453)

This commit is contained in:
Michael Snoyman 2012-11-18 19:03:26 +02:00
parent b7aa72e104
commit 6a7102f44e
3 changed files with 38 additions and 4 deletions

View File

@ -13,7 +13,11 @@ import Text.Hamlet (hamlet)
import qualified Data.Text as T import qualified Data.Text as T
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Control.Monad.IO.Class (liftIO) import Control.Monad.IO.Class (liftIO)
import Control.Monad (when)
import Control.Exception (throwIO) import Control.Exception (throwIO)
import Text.Julius (julius, rawJS)
import Data.Aeson (toJSON)
import Network.URI (uriPath, parseURI)
pid :: Text pid :: Text
pid = "browserid" pid = "browserid"
@ -61,12 +65,41 @@ helper maudience = AuthPlugin
_ -> notFound _ -> notFound
, apLogin = \toMaster -> do , apLogin = \toMaster -> do
addScriptRemote browserIdJs 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| toWidget [hamlet|
$newline never $newline never
<p> <p>
<a href="javascript:navigator.id.getVerifiedEmail(function(a){if(a)document.location='@{toMaster complete}/'+a});"> <a href="javascript:#{onclick}()">
<img src="https://browserid.org/i/sign_in_green.png"> <img src="https://browserid.org/i/sign_in_green.png">
|] |]
} }
where where
stripScheme t = fromMaybe t $ T.stripPrefix "//" $ snd $ T.breakOn "//" t 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

View File

@ -13,6 +13,7 @@ import Yesod.Form
import Network.Wai.Handler.Warp (run) import Network.Wai.Handler.Warp (run)
import Network.HTTP.Conduit import Network.HTTP.Conduit
import Network.TLS import Network.TLS
import Network.Wai.Middleware.RequestLogger
data BID = BID { httpManager :: Manager } data BID = BID { httpManager :: Manager }
@ -49,6 +50,4 @@ instance RenderMessage BID FormMessage where
main :: IO () main :: IO ()
main = do main = do
m <- newManager def m <- newManager def
{ managerCheckCerts = \_ _ -> return CertificateUsageAccept toWaiApp (BID m) >>= run 3000 . logStdoutDev
}
toWaiApp (BID m) >>= run 3000

View File

@ -26,6 +26,7 @@ library
, yesod-persistent >= 1.1 && < 1.2 , yesod-persistent >= 1.1 && < 1.2
, hamlet >= 1.1 && < 1.2 , hamlet >= 1.1 && < 1.2
, shakespeare-css >= 1.0 && < 1.1 , shakespeare-css >= 1.0 && < 1.1
, shakespeare-js >= 1.0.2 && < 1.2
, yesod-json >= 1.1 && < 1.2 , yesod-json >= 1.1 && < 1.2
, containers , containers
, unordered-containers , unordered-containers
@ -40,6 +41,7 @@ library
, lifted-base >= 0.1 , lifted-base >= 0.1
, blaze-html >= 0.5 && < 0.6 , blaze-html >= 0.5 && < 0.6
, blaze-markup >= 0.5.1 && < 0.6 , blaze-markup >= 0.5.1 && < 0.6
, network
exposed-modules: Yesod.Auth exposed-modules: Yesod.Auth
Yesod.Auth.BrowserId Yesod.Auth.BrowserId