OpenID claimed IDs

This commit is contained in:
Michael Snoyman 2012-04-20 10:14:32 +03:00
parent e19597cbf7
commit e2c79f95bd
4 changed files with 39 additions and 8 deletions

1
.gitignore vendored
View File

@ -6,5 +6,4 @@ dist
client_session_key.aes client_session_key.aes
cabal-dev/ cabal-dev/
yesod/foobar/ yesod/foobar/
yesod-platform/yesod-platform.cabal
.virthualenv .virthualenv

View File

@ -4,6 +4,8 @@ module Yesod.Auth.OpenId
( authOpenId ( authOpenId
, authOpenIdExtended , authOpenIdExtended
, forwardUrl , forwardUrl
, claimedKey
, credsIdentClaimed
) where ) where
import Yesod.Auth import Yesod.Auth
@ -15,9 +17,10 @@ import Yesod.Widget (toWidget, whamlet)
import Yesod.Request import Yesod.Request
import Text.Cassius (cassius) import Text.Cassius (cassius)
import Text.Blaze (toHtml) import Text.Blaze (toHtml)
import Data.Text (Text) import Data.Text (Text, isPrefixOf)
import qualified Yesod.Auth.Message as Msg import qualified Yesod.Auth.Message as Msg
import Control.Exception.Lifted (SomeException, try) import Control.Exception.Lifted (SomeException, try)
import Data.Maybe (fromMaybe)
forwardUrl :: AuthRoute forwardUrl :: AuthRoute
forwardUrl = PluginR "openid" ["forward"] forwardUrl = PluginR "openid" ["forward"]
@ -80,11 +83,40 @@ authOpenIdExtended extensionFields =
completeHelper :: YesodAuth m => [(Text, Text)] -> GHandler Auth m () completeHelper :: YesodAuth m => [(Text, Text)] -> GHandler Auth m ()
completeHelper gets' = do completeHelper gets' = do
master <- getYesod master <- getYesod
eres <- lift $ try $ OpenId.authenticate gets' (authHttpManager master) eres <- lift $ try $ OpenId.authenticateClaimed gets' (authHttpManager master)
toMaster <- getRouteToMaster toMaster <- getRouteToMaster
let onFailure err = do let onFailure err = do
setMessage $ toHtml $ show (err :: SomeException) setMessage $ toHtml $ show (err :: SomeException)
redirect $ toMaster LoginR redirect $ toMaster LoginR
let onSuccess (OpenId.Identifier ident, _) = let onSuccess oir = do
setCreds True $ Creds "openid" ident gets' let claimed =
case OpenId.oirClaimed oir of
Nothing -> id
Just (OpenId.Identifier i) -> ((claimedKey, i):)
gets'' = claimed $ filter (\(k, _) -> not $ "__" `isPrefixOf` k) gets'
i = OpenId.identifier $ OpenId.oirOpLocal oir
setCreds True $ Creds "openid" i gets''
either onFailure onSuccess eres either onFailure onSuccess eres
-- | The main identifier provided by the OpenID authentication plugin is the
-- \"OP-local identifier\". There is also sometimes a \"claimed\" identifier
-- available.
--
-- In the 'credsExtra' field of the 'Creds' datatype, you can lookup this key
-- to find the claimed identifier, if available.
--
-- > let finalID = fromMaybe (credsIdent creds)
-- > $ lookup claimedKey (credsExtra creds)
--
-- Since 1.0.2
claimedKey :: Text
claimedKey = "__CLAIMED"
-- | A helper function which will get the claimed identifier, if available, falling back to the OP local identifier.
--
-- See 'claimedKey'.
--
-- Since 1.0.2
credsIdentClaimed :: Creds m -> Text
credsIdentClaimed c = fromMaybe (credsIdent c)
$ lookup claimedKey (credsExtra c)

View File

@ -44,7 +44,7 @@ instance YesodAuth BID where
type AuthId BID = Text type AuthId BID = Text
loginDest _ = AfterLoginR loginDest _ = AfterLoginR
logoutDest _ = AuthR LoginR logoutDest _ = AuthR LoginR
getAuthId = return . Just . credsIdent getAuthId = return . Just . credsIdentClaimed
authPlugins _ = [authOpenId] authPlugins _ = [authOpenId]
authHttpManager = httpManager authHttpManager = httpManager

View File

@ -1,5 +1,5 @@
name: yesod-auth name: yesod-auth
version: 1.0.1 version: 1.0.2
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Michael Snoyman, Patrick Brisbin author: Michael Snoyman, Patrick Brisbin
@ -16,7 +16,7 @@ flag ghc7
library library
build-depends: base >= 4 && < 5 build-depends: base >= 4 && < 5
, authenticate >= 1.2 && < 1.3 , authenticate >= 1.2.1 && < 1.3
, bytestring >= 0.9.1.4 && < 0.10 , bytestring >= 0.9.1.4 && < 0.10
, yesod-core >= 1.0 && < 1.1 , yesod-core >= 1.0 && < 1.1
, wai >= 1.2 && < 1.3 , wai >= 1.2 && < 1.3