带有 Yesod.Auth.Email 的自定义注册表



我有一个关于为什么Yesod.Auth是这样完成的问题。我试图创建一个自定义注册表单 - 即:除了电子邮件之外的更多字段 - 以下是我在此过程中遇到的问题:

  1. 我尝试创建电子邮件模块中定义的函数的自定义版本来呈现自定义模板:defaultEmailLoginHandler,defaultRegisterHandler,defaultForgotPasswordHandler。

这让我想知道:为什么我们不能简单地提供一个自定义的哈姆雷特文件并完成它?为什么必须创建这些函数的自定义版本?

  1. 模板部分完成后,我开始处理表单,在这里我碰壁了。我尝试创建registerHelper函数的自定义版本,但这不是 Yesod.Auth.Email 类的可见成员 因此,创建自定义寄存器助手将不起作用。然后我想我可以通过重写postRegisterR来提供一个自定义路由来处理表单,但我又一次不走运了。

为什么这些函数,特别是注册助手,没有创建为 Yesod.Auth.Email 的可见成员?

  1. 我的第三次尝试是"分叉"整个 Email.hs 模块,但我再次未能满足一些要求来实现这一点。在这种情况下,Yesod.PasswordStore 不是公开的模块,因此我无法将其导入到我的自定义 Yesod.Auth.Email 中。

为什么Yesod.PasswordStore没有暴露?

鉴于我不想深入兔子洞并重写密码存储的分支,我才意识到不可能使用 Yesod.Auth.Email 自定义注册表。

我在这里错过了什么还是我做对了?为什么 Yesod.Auth.Email 是以这种方式建造的?

我并不完全了解Michael Snoyman在这方面所做的设计决策,但我的理由是"电子邮件"是注册帐户所需的最少信息。注册电子邮件后,注册链接电子邮件将发送到您的帐户,您可以通过该电子邮件验证您的帐户。它在此密码重置页面上,我在其中定义所有自定义字段以及设置新密码。我定义了自己的处理程序来设置新密码。代码通常是这样的:

if (jpNewPassword profile == jpConfirmPassword profile)
then do
newPass <- liftIO $ saltPass (jpNewPassword profile)
lift $
runDB $
do user <- getUser maid
update maid [UserPassword =. (Just newPass)]

以上是我个人项目之一的代码。

为什么我们不能简单地提供一个自定义的 Hamlet 文件并完成它?

好吧,您仍然可以提供自定义哈姆雷特文件。这就是我的setPasswordHandlerYesodAuthEmail实例中的定义方式:

setPasswordHandler _ =
selectRep $
do provideRep $ return $(shamletFile "./templates/password.shamlet")

为什么Yesod.PasswordStore没有暴露?

如上所述,您仍然可以更新密码而不会暴露Yesod.PasswordStore。相关功能Yesod.Auth.Email模块中。

话虽如此,我能理解你的担忧。这就是为什么我在模块Yesod.Auth.Email为所有端点实现了 JSON 端点,以便可以在客户端本身轻松完成验证和其他工作。这些端点已记录在上面链接的 Haddock 页面中。但是如果你想在注册页面中有自定义字段,我认为它可能涉及Yesod.Auth.Email模块中的一些代码更改。我建议您在github中打开一个问题(如果您也可以发送PR,则可以使用布朗尼点!(并在那里向我们提供反馈。我们非常乐于接受改变!

最新更新