在使用 Yesod 的 OpenId 实现进行身份验证后,有什么方法可以检索用户的电子邮件地址?
在我的测试应用程序中,重定向和身份验证正确发生,并且 mayAuthId 为我的数据库中的相应条目提供了一个 ID。但是,该身份存储为 URL。
我可以使用它,但如果其他 OpenId 包允许,还可以获取用于身份验证的实际电子邮件会很好。Yesod的OpenId可以做到这一点吗?我可以用 authOpenIdExtended 做些什么(不清楚如何使用它)?
看看GoogleEmail模块。您需要记住的一件事是,您不一定信任所有的 OpenID 提供商。如果您将电子邮件地址用于任何重要的事情,恶意用户可以简单地设置一个 OpenID 提供程序,让他/她声明他/她想要的任何地址。
再次查看后,我找到了答案:
首先,我们需要使用带有正确参数的 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)。我期待谷歌也使用“openid.ax.value.email”键,但足够接近。
我希望这可以帮助别人。