OpenID claimed IDs
This commit is contained in:
parent
e19597cbf7
commit
e2c79f95bd
1
.gitignore
vendored
1
.gitignore
vendored
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user