Hier ist was ich benutze. Das Token muss nicht unbedingt gehört werden, um es zu erraten. Es ist eher eine kurze URL-Kennung als alles andere, und ich möchte es kurz halten. Ich habe einige Beispiele befolgt, die ich online gefunden habe, und im Falle einer Kollision denke ich, dass der folgende Code das Token neu erstellt, bin mir aber nicht sicher. Ich bin jedoch gespannt auf bessere Vorschläge, da sich dies an den Rändern etwas rau anfühlt.
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
Meine Datenbankspalte für das Token ist ein eindeutiger Index, den ich auch validates_uniqueness_of :token
für das Modell verwende. Da diese jedoch in Stapeln automatisch basierend auf den Aktionen eines Benutzers in der App erstellt werden (sie geben eine Bestellung auf und kaufen die Token im Wesentlichen), ist dies der Fall Es ist nicht möglich, dass die App einen Fehler auslöst.
Ich könnte auch die Wahrscheinlichkeit von Kollisionen verringern, am Ende eine weitere Zeichenfolge anhängen, etwas, das basierend auf der Zeit oder ähnlichem generiert wird, aber ich möchte nicht, dass das Token zu lang wird.
quelle
loop do
In diesem Fall sollte anstelle vonbegin...while
(Schleifentyp "do ... while") ein Grund (Schleifentyp "while ... do") verwendet werden (wobei die Schleife mindestens einmal ausgeführt werden muss ).ModelName
in der Methode loswerden ? Vielleicht durchself.class
stattdessen ersetzen ? Ansonsten ist es nicht sehr wiederverwendbar, oder?Ryan Bates verwendet in seinem Railscast auf Beta-Einladungen ein schönes Stück Code . Dies erzeugt eine alphanumerische Zeichenfolge mit 40 Zeichen.
quelle
Digest::SHA1.hexdigest([Time.now, rand].join)[0..10]
hexdigest
für eine bestimmte IP.Dies kann eine späte Antwort sein, aber um die Verwendung einer Schleife zu vermeiden, können Sie die Methode auch rekursiv aufrufen. Es sieht und fühlt sich für mich etwas sauberer an.
quelle
In diesem Artikel werden einige ziemlich raffinierte Methoden gezeigt:
https://web.archive.org/web/20121026000606/http://blog.logeek.fr/2009/7/2/creating-small-unique-tokens-in-ruby
Mein Favorit ist folgender:
quelle
if self.new_record? and self.access_token.nil?
... prüft das, ob das Token noch nicht gespeichert ist?validates_uniqueness_of :token
der Tabelle einfach einen eindeutigen Index hinzu und fügen Sie ihn mit einer Migration hinzu.Wenn Sie etwas Einzigartiges wollen, können Sie Folgendes verwenden:
Dadurch wird jedoch eine Zeichenfolge mit 32 Zeichen generiert.
Es gibt jedoch einen anderen Weg:
Beispiel: Für eine ID wie 10000 wäre das generierte Token "MTAwMDA =" (und Sie können es einfach für eine ID dekodieren, machen Sie es einfach
quelle
random_string = Digest::MD5.hexdigest("#{ActiveSupport::SecureRandom.hex(10)}-#{DateTime.now.to_s}-#{id}")[1..6]
wo ID die ID des Tokens ist.Base64::encode64(id.to_s)
der Zweck der Verwendung eines Tokens zunichte gemacht wird. Höchstwahrscheinlich verwenden Sie ein Token, um die ID zu verschleiern und die Ressource für jeden unzugänglich zu machen, der nicht über das Token verfügt. In diesem Fall könnte jedoch nur jemand ausgeführt werden,Base64::encode64(<insert_id_here>)
und er hätte sofort alle Token für jede Ressource auf Ihrer Site.string = (Digest::MD5.hexdigest "#{SecureRandom.hex(10)}-#{DateTime.now.to_s}")
Dies kann hilfreich sein:
Wenn Sie ein Sonderzeichen entfernen möchten, als das erste Argument '+ / =' und jedes Zeichen, das in das zweite Argument '0aZ' und 15 eingegeben wurde, ist die Länge hier.
Und wenn Sie die zusätzlichen Leerzeichen und das neue Linienzeichen entfernen möchten, fügen Sie Folgendes hinzu:
Hoffe das wird jedem helfen.
quelle
SecureRandom.urlsafe_base64
erreicht das gleiche auch.Sie können has_secure_token https://github.com/robertomiranda/has_secure_token verwenden
ist wirklich einfach zu bedienen
quelle
has_secure_token
kommt das mit Rails 5, aber ich habe 4.x verwendet. Ich habe die Schritte in diesem Artikel befolgt und jetzt funktioniert es für mich.Versuchen Sie Folgendes:
Ab Ruby 1.9 ist die UUID-Generierung integriert. Verwenden Sie die
SecureRandom.uuid
Funktion.Generieren von Guids in Ruby
Das war hilfreich für mich
quelle
Um eine richtige, mysql, varchar 32 GUID zu erstellen
quelle
SecureRandom.uuid.tr('-','').upcase
. Überprüfen Sie diesen Link zum Vergleich zwischen tr und gsub.quelle
Ich denke, Token sollte genauso behandelt werden wie ein Passwort. Als solche sollten sie in DB verschlüsselt werden.
Ich mache so etwas, um ein einzigartiges neues Token für ein Modell zu generieren:
quelle