从Yesod OpenID中检索电子邮件地址

3
有没有办法在使用Yesod的OpenId实现进行身份验证后检索用户的电子邮件地址?
在我的测试应用程序中,重定向和身份验证正确进行,并且maybeAuthId给出了对应数据库条目的ID。但是,该标识存储为URL。
我可以使用此功能,但获取用于身份验证的实际电子邮件也很好,就像其他OpenId包允许的那样。 Yesod的OpenId是否支持此功能?我可以通过authOpenIdExtended做些什么(不清楚如何使用)?
2个回答

3

请看GoogleEmail模块。需要记住的一件事是,并不是每个OpenID提供商都可以信任。如果您将电子邮件地址用于任何重要的事情,邪恶用户可能会简单地设置一个OpenID提供商,从而允许他/她声称任何他/她想要的地址。


我认为我理解了如何使用authOpenIdExtended(复制GoogleEmail.hs中选项列表),但是一旦回到我的处理程序中,我不知道如何获取电子邮件地址。在GoogleEmail.hs中有一个调用lookupGetParam的方法,但是一旦我们回到我的代码中,这样做就太晚了,对吗?我是否误读了正在发生的事情?如果有影响,我正在使用yesod-auth 1.0.1(无法使用更新版本)。 - Chris Mennie
你提到了一个很好的观点,不要将电子邮件地址用于任何重要事项。我的 ID 将基于通过 OpenId 返回的 ID,我只是想方便地获取电子邮件地址。 - Chris Mennie
我自己没有尝试过通过authOpenIdExtended,但我认为credsExtra会有你需要的信息。 - Michael Snoyman
我觉得我在这个框架中有点迷失了。要使用credsExtra,我需要一个Creds。从getHomeR函数中,我该怎么获取它呢? - Chris Mennie

2

在重新研究后,我找到了一个答案:

首先,我们需要使用正确的参数authOpenIdExtended:

authPlugins _ = [authOpenIdExtended [("openid.ns.ax", "http://openid.net/srv/ax/1.0"), 
                                     ("openid.ax.mode", "fetch_request"), 
                                     ("openid.ax.type.email", "http://axschema.org/contact/email"),
                                     ("openid.ax.required", "email")
                                     ]]

我在这个页面上找到了以下数值:https://developers.google.com/accounts/docs/OpenID 并验证了它们可以与 Google 和 Yahoo 一起使用。为了使用我们检索到的电子邮件地址,我们在传递给 getAuthId 的 creds 参数上调用 "credsExtra creds"。这会给我们一个包含来自 OpenId 提供者响应的元组列表。当使用上述参数进行 authOpenIdExtended 时,我们在键/值元组中找到我们的电子邮件,其值为 "openid.ax.value.email"(对于 Yahoo)或 "openid.ext1.value.email"(对于 Google)。我本来期望 Google 也使用 "openid.ax.value.email" 键,但已经足够接近了。希望这能帮助某些人。

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