[解決済み] Railsでユニークなトークンを作成するための最良の方法?
質問
私が使っているのは、こんな感じです。トークンは必ずしも推測を聞く必要はなく、何よりも短いurl識別子のようなもので、短くしたいのです。ネットで見つけたいくつかの例と、衝突したときのことを想定して、それに従いました。 と思います。 のコードでトークンが再現されますが、実際のところはわかりません。しかし、これは少し荒削りな感じがするので、私はより良い提案を見たいと思っています。
def self.create_token
random_number = SecureRandom.hex(3)
"1X#{random_number}"
while Tracker.find_by_token("1X#{random_number}") != nil
random_number = SecureRandom.hex(3)
"1X#{random_number}"
end
"1X#{random_number}"
end
私のデータベースのトークン用のカラムはユニークインデックスで、さらに
validates_uniqueness_of :token
しかし、これらはアプリ内のユーザーのアクションに基づいて自動的にバッチで作成されるため(ユーザーは注文を行い、トークンを購入します)、アプリがエラーを投げるようにすることは実行不可能です。
また、衝突の可能性を減らすために、最後に別の文字列を追加して、時間に基づいて生成するなどの方法も考えられますが、トークンがあまり長くなりすぎるのも困ります。
解決方法は?
-- アップデート
現在 2015年1月9日のことです。 にソリューションが実装されました。 Rails 5 ActiveRecordのセキュアトークンの実装 .
-- Rails 4 & 3 --。
今後の参考までに、安全なランダムトークンを作成し、モデルの一意性を確保します(Ruby 1.9 と ActiveRecord を使用する場合)。
class ModelName < ActiveRecord::Base
before_create :generate_token
protected
def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless ModelName.exists?(token: random_token)
end
end
end
編集する
カイン
を置き換えることを提案し、私はそれに同意しました。
begin...end..while
で
loop do...break unless...end
というのは、以前の実装が将来削除される可能性があるからです。
編集2
Rails 4 と concerns では、これを concern に移動することをお勧めします。
# app/models/model_name.rb
class ModelName < ActiveRecord::Base
include Tokenable
end
# app/models/concerns/tokenable.rb
module Tokenable
extend ActiveSupport::Concern
included do
before_create :generate_token
end
protected
def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless self.class.exists?(token: random_token)
end
end
end
関連
-
[解決済み] Ruby on Railsのデータベースをパージまたは再作成する
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] PythonでGUID/UUIDを作成する方法
-
[解決済み] GUIDは100%一意ですか?
-
[解決済み] C# どのようにGuid値を作成するのですか?
-
[解決済み】Railsの認証トークンを理解する
-
[解決済み】UUIDはどのようにユニークなのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜでしょうか?
-
[解決済み] Railsです。NameError: 初期化されていない定数
-
[解決済み] Rails のインストールに失敗する: activesupport には Ruby のバージョン >= 2.2.2 が必要です。
-
[解決済み] Paramが無いか、値が空である。ParameterMissing in ResultsController#update
-
[解決済み] Railsでpng画像を文字列形式で表示するには?
-
[解決済み] 検索 vs 発見する by vs どこに
-
[解決済み] RVMでRubyのデフォルトバージョンを設定するには?
-
[解決済み] Rails 4で、以前のバージョンのRailsでattr_accessibleを使用していた状況に遭遇した場合、Forbidden Attributes Errorが発生する。
-
[解決済み] Rubyに「do ... while」ループはあるのか?
-
[解決済み] RubyでGUIDを生成する