无需记录即可更新用户简报订阅

时间:2017-02-17 11:24:34

标签: ruby-on-rails authentication authorization ruby-on-rails-5

我有一个带身份验证的用户模型。

如果登录,用户可以更新其简报订阅首选项(即选项/选择退出)

但是,我还想为尚未确认其帐户的用户(通过电子邮件中的链接)提供对该页面的有限访问权限。

除了订阅偏好之外,他无法更改任何其他信息。

目前,我只能从一份简报中取消订阅用户。 我想要的是有一个包含所有订阅的表单。

为确保安全,这样做的过程是什么? (即用户将无法更改电子邮件/用户名以从提供的链接更新其他用户)

2 个答案:

答案 0 :(得分:0)

许多新闻简报使用的模式是生成长随机令牌并将其注入电子邮件中提供的链接URL。每个随机令牌映射到用户;这样,通过检查令牌参数,可以使用户与该电子邮件相关联。

例如,假设简报页面为/newsletters/settings。通过电子邮件发送的实际链接为/newsletters/settings?code=12345678901234567890,其中code参数因用户而异,甚至每个用户在某些情况下发送电子邮件。

但这些令牌具有安全隐患。例如,如果将简报转发给另一个人,因为他们转发原始电子邮件。如果他们不删除链接,第三方可以冒充原始用户并管理订阅。

答案 1 :(得分:0)

您可以使用Ruby的Digest模块生成随机SHA1或MD5哈希,并将其注入您发送给用户的链接。

确保检查哈希匹配用户的电子邮件,粗略的算法如下:

为有问题的用户创建一个哈希并将其存储在数据库中:

user.email_hash = Digest::SHA1.hexdigest(user.email)
user.save

在处理电子邮件验证的控制器方法中,检查哈希是否与用户的详细信息匹配

if current_user.email_hash == params[:email_hash]
  # A match, process the activation and invalidate the hash
  user.activate
  user.invalidate_hash # This can set the email_hast to nil, for example.
else
  # Someone's trying to be sneaky, or accessing an invalidated hash
end

有一些方法可以使这更加安全,例如,将用户的用户名和电子邮件组合起来创建哈希值,将端点置于速率限制之后,以防止强力尝试猜测哈希等,但这应该提供一个很好的起点。

最后,不要忘记在需要它的任何文件中要求digest\sha1模块(require 'digest/sha1')。