我有一个这样的链接:http://www.somesite.com/s/bkucoj?i=#{@client.id}
。我如何确保客户端的id会被安全地传递(散列/加密),而不仅仅是裸号码?
所以我们的目标是得到这样的东西:
http://www.somesite.com/s/bkucoj?i=f1nSbd3bH34ghfAh12lcvzD
而不是
http://www.somesite.com/s/bkucoj?i=12
。
我怎样才能做到这一点?
此外,我还想确保,在另一端,客户端ID是正确获得的非常感谢。
最好的方法可能是在用户模型中添加一个额外的列(非null,唯一),该列在用户创建时随机化。
before_create do
self.uuid = SecureRandom.uuid
end
然后您可以使用uuid
来识别用户,而不是id。
添加此列时,自然需要修改所有现有用户。
实施细节
您的迁移需要有三个部分。首先,您需要向users
表添加一个uniq,可为null的列uuid。然后,您需要遍历现有客户并填充此列。之后,您可以使列不可为null。它很可能看起来像这样:
class Blah000000000 < ActiveRecord::Migration
class User < ActiveRecord::Base
before_save { self.uuid ||= SecureRandom.uuid }
end
def up
add_column :users, :uuid, :string, unique: true
User.all.each &:save!
change_column :user, :uuid, string, unique: true, null: false
end
def down
remove_column :users, :uuid
end
end
您可以添加一个额外的参数,该参数是id的HMAC或数字签名。收件人可以验证id是否没有更改。