【问题标题】:Rails 4 confirm a new user's email addressRails 4 确认新用户的电子邮件地址
【发布时间】:2014-02-17 00:57:03
【问题描述】:

我已经完成了http://railstutorial.org/chapters 的 Rails 4 教程并完成了大部分练习。该项目的几个建议扩展名列在我创建应用程序的下一步的列表顶部。这些是注册时的电子邮件确认功能和记住密码功能。我注意到有几个 gem 可以帮助我解决这个问题,但是当我观看了几个 Railscast 并阅读了一些教程时,它们并没有真正适用于我的情况,或者涉及一个复杂的 gem 来处理这一切(设计)。此外,在 Devise 的教程中,总是假设我是从零开始的,但事实并非如此。任何人都可以帮助我或指出正确的方向来完成这两个功能,而我的经验有限,被认为是安全且易于实施的?

另外,值得一提的是,我最终选择了 state_machine 作为一个有用的 gem,用于这个功能以及未来的功能。如果有人对这种或另一种方式有想法,我很想听听。现在,我的用户模型中存在两种状态:非活动和活动。

如果我能澄清任何事情,请告诉我。谢谢!

编辑:

我选择在我发送给注册我网站的用户的电子邮件中实施注册链接。我创建了一个 UserMailer 类,该类在注册时成功向用户发送电子邮件。我正在考虑将更新放在用户表的 email_token 属性的位置:

  • 选项 1:

/app/controllers/users_controller.rb

 ...
 def create
   redirect_to_root_if_signed_in

   @user = User.new(user_params)

   if @user.save
     sign_in @user
+    @user.update_attribute(email_token: User.encrypt(User.new_token))
     UserMailer.signup_confirmation(@user).deliver
     flash[:success] = "Welcome to the Sample App!"
     redirect_to @user
   else
     render 'new'
   end
 end
 ...
  • 选项 2:

/app/models/user.rb

   before_create :create_email_token

 ...

   private

     def create_email_token
       self.email_token = User.encrypt(User.new_token)
     end

还有:

  1. 我将如何命名负责响应 用户点击电子邮件中的网址?一种如何格式化 url,因此控制器将响应切换激活 我有什么状态?状态是一个整数值,名称为:active:inactive 使用 state_machine gem。
  2. 什么是指定路由的 RESTful 方式?如何在 user_mailer.rb 中生成 url?它应该是 get 还是 put 在我的 routes.rb 中?

【问题讨论】:

  • “记住密码”你说的是“记住我”吗?至于注册时的电子邮件确认,真的需要吗?这一步是失去用户的好地方。这个过程并不能很好地转换。我会推荐最简单的路线。不做。
  • 记住密码是在您忘记密码时,应用程序会引导您完成一个过程,允许您恢复密码或使用临时密码重置密码。 “记住我”会这样做吗?至于电子邮件确认,我当然希望有机会向我的用户发送电子邮件,如果我做的唯一检查是电子邮件格式的正则表达式,我无法假设他们的电子邮件是真实的一。另外,在没有确认的情况下,为什么要存储它呢?你的意思是这个过程不能很好地转换。我所知道的最大的网站都使用这个流程并且不会失去很多用户,对吧?
  • 那不是“记住密码”,是“忘记密码”。
  • 你是对的。但这里的另一个主要问题是电子邮件确认。有什么想法吗?
  • @JakeSmith 仅供参考,您在一个 SO 线程中提出了两个问题,您可能应该将每个问题拆分为各自的线程。至于“记住我”功能,我建议观看 Ryan Bate 的 railscast 第 274 集,railscasts.com/episodes/274-remember-me-reset-password

标签: ruby-on-rails railstutorial.org password-recovery email-confirmation


【解决方案1】:

这是解决方案的高级概述。

在用户模型上,您需要一个默认状态为 false 的布尔列。您还需要一个字符串列来存储令牌。令牌将是由SecureRandom.urlsafe_base64 之类的东西获得的随机字符串。

那么你应该需要一个控制器,它将接受令牌作为参数,然后通过令牌找到用户并更改上述布尔字段的值。

接下来,您需要一个邮件程序,它会向用户发送一封电子邮件,其中包含激活帐户的 URL。

如果您有任何其他问题,请告诉我。

【讨论】:

  • 谢谢。这与我的假设几乎是同义词,并填补了一些漏洞。通过我学习 Web 开发的努力,我注意到有很多安全问题向我指出,这是我从未想过的自己的。你能想到我在这个实现中应该注意的任何安全问题吗?
  • 另外,我会实施这个并尽快回复你,并在我得到它的工作时将你的答案标记为答案:) 非常感谢
  • 我想在UserMailer.signup_confirmation(@user).deliver 的后续行的 users_controller.rb 中设置我的 users 表的 email_token 属性。您是否同意那将是拨打SecureRandom.urlsafe_base64 的最佳地点?或者我应该把它放在 user.rb 文件的 before_create 中?我将使用相关代码更新我的问题...
  • 我会在模型中调用SecureRandom.urlsafe_base64 例如@user.set_token 应该在控制器中调用。然后在控制器中发送邮件。
【解决方案2】:

您可以使用令牌字段来完成。当他们登录并输入正确的令牌(证明他们输入了正确的电子邮件)时,他们的用户数据库条目中的令牌列被设置为 null,这意味着他们已经过验证。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2011-09-10
    • 2023-02-23
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    相关资源
    最近更新 更多