我想向客户发送一封电子邮件,允许他们编辑购买的部分信息,因此我的基本设置是向他们发送指向/follow_up_form/purchase.id的链接。
这显然不起作用,因为我们不希望任何人只是输入该URL并更改用户的信息,但我们的网站没有任何登录所需的购买。
有没有办法自动生成秘密网址,或通过某种真实性令牌?这感觉应该很简单,但我没有任何好的想法。
谢谢!
答案 0 :(得分:0)
您可以使用rails 5 has_secure_token并将其作为参数嵌入到URL中,例如/follow_up_form/purchase.id?tok='some_toke'返回表单进行编辑时,请检查此参数。这确实会让事情变得更加安全。
答案 1 :(得分:0)
我会在购买时添加token
列,并在创建后设置:
require 'secure_random'
class Purchase < ActiveRecord::Base
before_create :regenerate_token
def regenerate_token
self.token = SecureRandom.urlsafe_base64(24)
end
end
然后,您可以像设置任何其他嵌套资源一样设置跟进:
resources :purchases do
resources :follow_ups, only: [:new, :create]
end
要创建指向用户提供反馈的表单的链接:
<%= link_to("Tell us what you think", new_purchase_follow_up_url(@purchase, token: @purchase.token)) %>
这会向包含访问令牌的URL添加查询字符串参数。 要在控制器中进行身份验证,我们会检查访问令牌是否与我们为购买存储的内容匹配:
class FollowUpsController < ApplicationConrtroller
before_action :set_purchase!
before_action :check_token!
# ...
private
def set_purchase!
@purchase = Purchase.find(params[:purchase_id])
end
def check_token!
unless params[:access_token] == @purchase.token
redirect_to root_path, error: 'You are not authorized' and return false
end
end
end
要在new和create操作之间传递令牌,请将其作为隐藏输入添加到表单中:
<%= form_for(@follow_up) do |f| %>
<%= hidden_field_tag :access_token, @purchase.token %>
<% end %>