Oto, czego używam. Token niekoniecznie musi zostać usłyszany, aby odgadnąć, bardziej przypomina krótki identyfikator adresu URL niż cokolwiek innego i chcę, aby był krótki. I już po kilka przykładów znalazłem w Internecie oraz w razie kolizji, myślę, że kod poniżej będzie odtworzyć token, ale nie jestem pewien rzeczywistym. Jestem jednak ciekawy, aby zobaczyć lepsze sugestie, ponieważ wydaje się to trochę szorstkie na krawędziach.
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
Moja kolumna bazy danych dla tokena to unikalny indeks i używam go również validates_uniqueness_of :token
na modelu, ale ponieważ są one tworzone automatycznie partiami na podstawie działań użytkownika w aplikacji (zasadniczo składają zamówienie i kupują tokeny), nie jest możliwe, aby aplikacja zgłosiła błąd.
Mógłbym też, jak sądzę, zmniejszyć ryzyko kolizji, dołączyć na końcu kolejny ciąg, coś wygenerowanego na podstawie czasu lub coś w tym rodzaju, ale nie chcę, aby token był zbyt długi.