我是一个Haskell、Yesod和Facebook开发者API的初学者,尽管如此,我正在尝试使用这些技术编写Web应用程序。我试图实现的第一个功能是用户必须能够使用他们的Facebook登录来登录我的Web应用程序,并且我需要获取唯一的用户ID和他们的电子邮件地址。
这是我的代码;这基本上是http://www.yesodweb.com/book/authentication-and-authorization上可以找到的代码的副本。我改变的唯一一件事是从BrowserID切换到Facebook Login认证,并请求“email”权限。
当我运行它时,它可以正常工作 - 我可以登录和退出,Facebook登录页面指出我正在授权访问我的电子邮件地址,并且我可以正确地获取用户ID。到目前为止,一切都好。
但是,一旦我登录后,我无法弄清楚如何实际获取用户的电子邮件地址。
有人能提供一些指导吗?
谢谢!
这是我的代码;这基本上是http://www.yesodweb.com/book/authentication-and-authorization上可以找到的代码的副本。我改变的唯一一件事是从BrowserID切换到Facebook Login认证,并请求“email”权限。
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Data.Default (def)
import Data.Text
import Network.HTTP.Conduit (Manager, newManager)
import qualified Facebook as FB
import Yesod
import Yesod.Auth
import Yesod.Facebook (YesodFacebook(..))
import Yesod.Auth.Facebook.ServerSide
data App = App
{ httpManager :: Manager
}
mkYesod "App" [parseRoutes|
/ HomeR GET
/auth AuthR Auth getAuth
|]
instance Yesod App where
approot = ApprootStatic "<my server url>"
instance YesodAuth App where
type AuthId App = Text
getAuthId = return . Just . credsIdent
loginDest _ = HomeR
logoutDest _ = HomeR
authPlugins _ =
[ authFacebook ["email"]
]
authHttpManager = httpManager
maybeAuthId = lookupSession "_ID"
instance YesodFacebook App where
fbCredentials _ = FB.Credentials "<my app>" "<my app id>" "<my secret>"
fbHttpManager = httpManager
instance RenderMessage App FormMessage where
renderMessage _ _ = defaultFormMessage
getHomeR :: Handler Html
getHomeR = do
maid <- maybeAuthId
defaultLayout
[whamlet|
<p>Your current auth ID: #{show maid}
$maybe _ <- maid
<p>
<a href=@{AuthR LogoutR}>Logout
$nothing
<p>
<a href=@{AuthR LoginR}>Go to the login page
|]
main :: IO ()
main = do
man <- newManager def
warpEnv $ App man
当我运行它时,它可以正常工作 - 我可以登录和退出,Facebook登录页面指出我正在授权访问我的电子邮件地址,并且我可以正确地获取用户ID。到目前为止,一切都好。
但是,一旦我登录后,我无法弄清楚如何实际获取用户的电子邮件地址。
有人能提供一些指导吗?
谢谢!