2015-10-25 8 views
5

Mam tabeli w mojej bazy danych o nazwie keys że ma taką strukturę:laravel: Generowanie losowe Unikalny token

id | user_id | token_id | token_key 

każdym razem, gdy użytkownik loguje się do mojej strony, muszę wygenerować nowy token_id i token_key zestaw do tego użytkownika. Jak mogę wygenerować losowy token zarówno dla token_id, jak i dla token_key, zachowując jednocześnie dwie wartości?

Na przykład, jeżeli:

  • token_id jest dfbs98641aretwsg,
  • token_key jest sdf389dxbf1sdz51fga65dfg74asdf

Znaczenie:

id | user_id | token_id   | token_key 
1 | 1  | dfbs98641aretwsg | sdf389dxbf1sdz51fga65dfg74asdf 

Nie ma wiersza w tabeli z ta kombinacja tokenów. Jak mogę to zrobić?

Odpowiedz

10

Unikałbym dołączenia dodatkowej paczki dla sprawy takiej jak ta. Coś jak:

do { 
    $token_id = makeRandomToken(); 
    $token_key = makeRandomTokenKey(); 
} while (User::where("token_id", "=", $token_id)->where("token_key", "=", $token_key)->first() instanceof User); 

... powinien zrobić. Zastąp nazwę swojego modelu, jeśli różni się od "Użytkownika", i użyj swoich lub sugerowanych funkcji do tworzenia losowych ciągów znaków.

+0

Czy możesz wyjaśnić, jak pętla while zagwarantuje tam wygrał czy to jakieś duplikaty? – user5486944

+0

Dokładniej, co robi 'instanceof' w pętli while? – user5486944

+2

['do-while'] (http://php.net/manual/en/control-structures.do.while.php) pętla będzie" robić "tak długo, jak długo wyrażenie w" while "będzie" prawdziwe " '(i będzie działać co najmniej raz, w przeciwieństwie do' while-do'). W tym konkretnym przykładzie wygeneruje token id/key pair, a następnie spróbuje znaleźć użytkownika w bazie danych, która ma określoną parę tokenów i kluczy. 'instanceof' sprawdza czy wynik jest instancją klasy' User', co oznacza, że ​​sprawdza, czy taki użytkownik został znaleziony. Jeśli tak, 'zrobić' wykona się ponownie i utworzy kolejną parę, i tak dalej, dopóki nie znajdzie żadnego użytkownika mającego wygenerowaną parę identyfikatora/klucza tokena. –

15

Pod względem generowania tokenów, można użyć jednego z Laravel's Helper Functions; str_random().

Spowoduje to wygenerowanie losowego ciągu o określonej długości, np. str_random(16) wygeneruje losowy ciąg 16 znaków (wielkie litery, małe litery i cyfry).

W zależności od tego, jak używasz tokenów, czy naprawdę muszą być całkowicie unikalne? Biorąc pod uwagę, że pasują one do użytkownika, lub zakładam, że korzystasz z token_id, a następnie weryfikujesz to przeciwko token_key czy to naprawdę ma znaczenie, czy jest podwójne podwojenie jednego z nich? - choć szanse na to są bardzo małe!

Jeśli jednak są one naprawdę unikatowe, zawsze można użyć walidatora z ograniczeniem unique. Korzystając z this package można również przetestować, że oba z nich są unikatowe również z unique_with. A jeśli walidator zawiedzie, generuje nowy token w razie potrzeby.

Na podstawie przykładów użyjesz str_random(16) dla token_id i str_random(30) dla token_key.

0

Możesz użyć zależności, aby to zrobić.Dirape laravel-token

Uruchom komendę

composer require dirape/token 

W użytku kontrolera

use Dirape\Token\Token; 

można go używać tak:

User::create([ 
     'name'    => $data['name'], 
     'email'   => $data['email'], 
     'password'   => bcrypt($data['password']), 
     'token_key' => (new Token())->Unique('users', 'api_token', 60), 
     'active'   => 1 
    ])