Inilah yang saya gunakan. Token tidak harus didengar untuk menebak, ini lebih seperti pengidentifikasi url pendek daripada yang lainnya, dan saya ingin tetap singkat. Saya telah mengikuti beberapa contoh yang saya temukan online dan jika terjadi tabrakan, saya pikir kode di bawah ini akan membuat ulang token, tapi saya tidak begitu yakin. Saya ingin tahu melihat saran yang lebih baik, karena ini terasa agak kasar di tepinya.
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
Kolom basis data saya untuk token adalah indeks unik dan saya juga menggunakan validates_uniqueness_of :token
pada model, tetapi karena ini dibuat dalam batch secara otomatis berdasarkan tindakan pengguna di app (mereka melakukan pemesanan dan membeli token, pada dasarnya), itu tidak layak untuk membuat aplikasi melempar kesalahan.
Saya juga bisa, saya kira, untuk mengurangi kemungkinan tabrakan, menambahkan string lain pada akhirnya, sesuatu yang dihasilkan berdasarkan waktu atau sesuatu seperti itu, tetapi saya tidak ingin token terlalu lama.
sumber
loop do
("while ... do" jenis loop) harus digunakan dalam kasus ini (di mana loop diperlukan untuk menjalankan setidaknya satu kali) alih-alihbegin...while
("do ... while" tipe loop)?ModelName
metode ini? Mungkin menggantinya denganself.class
? Kalau tidak, itu tidak bisa digunakan kembali, bukan?Ryan Bates menggunakan sedikit kode yang bagus di Railscast- nya pada undangan beta . Ini menghasilkan string alfanumerik 40 karakter.
sumber
Digest::SHA1.hexdigest([Time.now, rand].join)[0..10]
hexdigest
untuk setiap IP yang diberikan.Ini mungkin respons yang terlambat tetapi untuk menghindari penggunaan loop Anda juga dapat memanggil metode secara rekursif. Terlihat dan terasa sedikit lebih bersih bagi saya.
sumber
Ada beberapa cara yang cukup apik untuk melakukan hal ini dalam artikel ini:
https://web.archive.org/web/20121026000606/http://blog.logeek.fr/2009/7/2/creating-small-unique-tokens-in-ruby
Favorit saya yang terdaftar adalah ini:
sumber
if self.new_record? and self.access_token.nil?
... apakah itu yang memeriksa untuk memastikan token belum disimpan?validates_uniqueness_of :token
dan tambahkan indeks unik ke tabel dengan migrasi.Jika Anda menginginkan sesuatu yang unik, Anda dapat menggunakan sesuatu seperti ini:
namun ini akan menghasilkan string 32 karakter.
Namun ada cara lain:
misalnya untuk id seperti 10000, token yang dihasilkan akan seperti "MTAwMDA =" (dan Anda dapat dengan mudah mendekodekannya untuk id, cukup buat
sumber
random_string = Digest::MD5.hexdigest("#{ActiveSupport::SecureRandom.hex(10)}-#{DateTime.now.to_s}-#{id}")[1..6]
ID tempat adalah ID token.Base64::encode64(id.to_s)
mengalahkan tujuan menggunakan token. Kemungkinan besar Anda menggunakan token untuk mengaburkan id dan membuat sumber daya tidak dapat diakses oleh siapa pun yang tidak memiliki token. Namun, dalam hal ini, seseorang dapat menjalankannyaBase64::encode64(<insert_id_here>)
dan mereka akan langsung memiliki semua token untuk setiap sumber daya di situs Anda.string = (Digest::MD5.hexdigest "#{SecureRandom.hex(10)}-#{DateTime.now.to_s}")
Ini mungkin bermanfaat:
Jika Anda ingin menghapus karakter khusus daripada memasukkan argumen pertama '+ / =' dan karakter apa pun dimasukkan ke argumen kedua '0aZ' dan 15 adalah panjangnya di sini.
Dan jika Anda ingin menghapus spasi tambahan dan karakter baris baru daripada menambahkan hal-hal seperti:
Semoga ini bisa membantu siapa saja.
sumber
SecureRandom.urlsafe_base64
mencapai hal yang sama juga.Anda dapat pengguna has_secure_token https://github.com/robertomiranda/has_secure_token
sangat mudah digunakan
sumber
has_secure_token
dilengkapi dengan Rails 5, tapi saya menggunakan 4.x. Saya telah mengikuti langkah-langkah pada artikel ini dan sekarang berfungsi untuk saya.Coba dengan cara ini:
Pada Ruby 1.9, generasi uuid sudah terintegrasi. Gunakan
SecureRandom.uuid
fungsinya.Menghasilkan Panduan di Ruby
Ini sangat membantu saya
sumber
Untuk membuat yang benar, mysql, varchar 32 GUID
sumber
SecureRandom.uuid.tr('-','').upcase
. Periksa tautan ini untuk perbandingan antara tr dan gsub.sumber
Saya pikir token harus ditangani seperti kata sandi. Dengan demikian, mereka harus dienkripsi dalam DB.
Saya melakukan sesuatu seperti ini untuk menghasilkan token baru yang unik untuk model:
sumber