Вот что я использую. Маркер не обязательно должен быть услышан, чтобы угадать, он больше похож на короткий 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
его для модели, но поскольку они создаются партиями автоматически на основе действий пользователя в приложении (они размещают заказ и покупают токены, по сути), это не возможно, чтобы приложение выдало ошибку.
Я мог бы также, я думаю, уменьшить вероятность коллизий, добавить еще одну строку в конце, что-то сгенерированное на основе времени или что-то в этом роде, но я не хочу, чтобы токен становился слишком длинным.
источник
loop do
этом случае следует использовать какую-либо причину (тип цикла "while ... do") (где цикл требуется запустить хотя бы один раз) вместоbegin...while
(тип цикла "do ... while")?ModelName
метода? Может быть, заменить егоself.class
вместо этого? В противном случае, это не очень многоразово, не так ли?Райан Бейтс использует небольшой кусок кода в своем Railscast для бета-приглашений . Это создает 40-символьную буквенно-цифровую строку.
источник
Digest::SHA1.hexdigest([Time.now, rand].join)[0..10]
hexdigest
для любого IP.Это может быть поздний ответ, но во избежание использования цикла вы также можете вызвать метод рекурсивно. Это выглядит и чувствует себя немного чище для меня.
источник
В этой статье продемонстрировано несколько приятных способов сделать это:
https://web.archive.org/web/20121026000606/http://blog.logeek.fr/2009/7/2/creating-small-unique-tokens-in-ruby
Мой любимый в списке это:
источник
if self.new_record? and self.access_token.nil?
... это то, что проверяет, чтобы убедиться, что токен еще не сохранен?validates_uniqueness_of :token
и добавьте уникальный индекс в таблицу с миграцией.Если вы хотите что-то уникальное, вы можете использовать что-то вроде этого:
однако это сгенерирует строку из 32 символов.
Однако есть и другой способ:
например, для идентификатора, подобного 10000, сгенерированный токен будет выглядеть как «MTAwMDA =» (и вы можете легко декодировать его для идентификатора, просто сделайте
источник
random_string = Digest::MD5.hexdigest("#{ActiveSupport::SecureRandom.hex(10)}-#{DateTime.now.to_s}-#{id}")[1..6]
где ID является идентификатором токена.Base64::encode64(id.to_s)
побеждает цель использования токена. Скорее всего, вы используете токен, чтобы скрыть идентификатор и сделать ресурс недоступным для всех, у кого нет токена. Однако в этом случае кто-то может просто запустить,Base64::encode64(<insert_id_here>)
и он сразу же получит все токены для каждого ресурса на вашем сайте.string = (Digest::MD5.hexdigest "#{SecureRandom.hex(10)}-#{DateTime.now.to_s}")
Это может быть полезно:
Если вы хотите удалить какой-либо специальный символ, введите первый аргумент «+ / =» и любой символ, указанный во втором аргументе «0aZ» и 15, - это длина.
И если вы хотите удалить лишние пробелы и символ новой строки, то добавьте такие вещи, как:
Надеюсь, это кому-нибудь поможет.
источник
SecureRandom.urlsafe_base64
достигает того же самого также.Вы можете использовать has_secure_token https://github.com/robertomiranda/has_secure_token
действительно прост в использовании
источник
has_secure_token
идет с Rails 5, но я использовал 4.x. Я следовал инструкциям этой статьи, и теперь она работает для меня.Попробуйте так:
Начиная с Ruby 1.9, генерация uuid встроена. Используйте
SecureRandom.uuid
функцию.Генерация направляющих в Ruby
Это было полезно для меня
источник
Чтобы создать правильный, mysql, varchar 32 GUID
источник
SecureRandom.uuid.tr('-','').upcase
, Проверьте эту ссылку для сравнения между tr и gsub.источник
Я думаю, что токен должен обрабатываться так же, как пароль. Как таковые, они должны быть зашифрованы в БД.
Я делаю что-то вроде этого, чтобы сгенерировать уникальный новый токен для модели:
источник