Voici ce que j'utilise. Le jeton n'a pas nécessairement besoin d'être entendu pour deviner, il s'agit plus d'un identifiant d'url court qu'autre chose, et je veux être bref. J'ai suivi quelques exemples que j'ai trouvés en ligne et en cas de collision, je pense que le code ci-dessous recréera le jeton, mais je ne suis pas vraiment sûr. Je suis curieux de voir de meilleures suggestions, cependant, car cela semble un peu difficile sur les bords.
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
Ma colonne de base de données pour le jeton est un index unique et j'utilise également validates_uniqueness_of :token
sur le modèle, mais comme ils sont créés automatiquement par lots en fonction des actions d'un utilisateur dans l'application (ils passent une commande et achètent les jetons, essentiellement), c'est impossible de faire en sorte que l'application génère une erreur.
Je pourrais aussi, je suppose, pour réduire les risques de collision, ajouter une autre chaîne à la fin, quelque chose de généré en fonction de l'heure ou quelque chose du genre, mais je ne veux pas que le jeton devienne trop long.
la source
loop do
(type de boucle "while ... do") doit être utilisée dans ce cas (où la boucle doit être exécutée au moins une fois) au lieu debegin...while
(type de boucle "do ... while")?ModelName
la méthode? Peut-être le remplacer à laself.class
place? Sinon, ce n'est pas très réutilisable, n'est-ce pas?Ryan Bates utilise un petit peu de code dans son Railscast sur les invitations bêta . Cela produit une chaîne alphanumérique de 40 caractères.
la source
Digest::SHA1.hexdigest([Time.now, rand].join)[0..10]
hexdigest
pour une IP donnée.Cela peut être une réponse tardive, mais pour éviter d'utiliser une boucle, vous pouvez également appeler la méthode de manière récursive. Cela me paraît et me semble légèrement plus propre.
la source
Il existe des moyens assez astucieux de le faire, illustrés dans cet article:
https://web.archive.org/web/20121026000606/http://blog.logeek.fr/2009/7/2/creating-small-unique-tokens-in-ruby
Ma liste préférée est la suivante:
la source
if self.new_record? and self.access_token.nil?
... est-ce ce qui vérifie que le jeton n'est pas déjà stocké?validates_uniqueness_of :token
et ajoutez simplement un index unique à la table avec une migration.Si vous voulez quelque chose qui sera unique, vous pouvez utiliser quelque chose comme ceci:
cependant cela générera une chaîne de 32 caractères.
Il existe cependant un autre moyen:
par exemple pour un identifiant comme 10000, le jeton généré serait comme "MTAwMDA =" (et vous pouvez facilement le décoder pour l'identifiant, faites simplement
la source
random_string = Digest::MD5.hexdigest("#{ActiveSupport::SecureRandom.hex(10)}-#{DateTime.now.to_s}-#{id}")[1..6]
où ID est l'ID du jeton.Base64::encode64(id.to_s)
encontre de l'objectif d'utiliser un jeton. Vous utilisez très probablement un jeton pour masquer l'identifiant et rendre la ressource inaccessible à quiconque ne possède pas le jeton. Cependant, dans ce cas, quelqu'un pourrait simplement s'exécuterBase64::encode64(<insert_id_here>)
et disposerait instantanément de tous les jetons pour chaque ressource de votre site.string = (Digest::MD5.hexdigest "#{SecureRandom.hex(10)}-#{DateTime.now.to_s}")
Cela peut être utile:
Si vous voulez supprimer un caractère spécial, mettez le premier argument '+ / =' et tout caractère mis dans le deuxième argument '0aZ' et 15 est la longueur ici.
Et si vous souhaitez supprimer les espaces supplémentaires et le caractère de nouvelle ligne, ajoutez des éléments tels que:
J'espère que cela aidera n'importe qui.
la source
SecureRandom.urlsafe_base64
réalise également la même chose.vous pouvez utiliser has_secure_token https://github.com/robertomiranda/has_secure_token
est vraiment simple à utiliser
la source
has_secure_token
est livré avec Rails 5, mais j'utilisais 4.x. J'ai suivi les étapes de cet article et maintenant cela fonctionne pour moi.Essayez de cette façon:
Depuis Ruby 1.9, la génération uuid est intégrée. Utilisez la
SecureRandom.uuid
fonction.Générer des guides dans Ruby
Cela a été utile pour moi
la source
Pour créer un GUID mysql, varchar 32 approprié
la source
SecureRandom.uuid.tr('-','').upcase
. Vérifiez ce lien pour une comparaison entre tr et gsub.la source
Je pense que le jeton doit être traité comme un mot de passe. En tant que tels, ils doivent être chiffrés dans DB.
Je ne fais pas quelque chose comme ça pour générer un nouveau jeton unique pour un modèle:
la source