如何使用yesod-auth-fb从Facebook登录获取用户的电子邮件地址?

3
我是一个Haskell、Yesod和Facebook开发者API的初学者,尽管如此,我正在尝试使用这些技术编写Web应用程序。我试图实现的第一个功能是用户必须能够使用他们的Facebook登录来登录我的Web应用程序,并且我需要获取唯一的用户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。到目前为止,一切都好。
但是,一旦我登录后,我无法弄清楚如何实际获取用户的电子邮件地址。
有人能提供一些指导吗?
谢谢!
1个回答

0
我之前曾经使用过Facebook API,据我所记,你所获得的仅仅是一个访问令牌,用于发送你的Facebook API请求。如果你想获取已登录用户的电子邮件地址,你可能应该发送一个HTTP请求(或使用Facebook API库)来获取用户信息,并使用适当的fields参数。更多细节在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接