wake-up-neo.net

Laravel: Generiere zufällige eindeutige Token

Ich habe in meiner Datenbank eine Tabelle namens keys, die folgende Struktur hat:

id | user_id | token_id | token_key

Jedes Mal, wenn sich ein Benutzer bei meiner Site anmeldet, muss ich einen neuen token_id und token_key für diesen Benutzer erstellen. Wie kann ich ein zufälliges Token für den token_id und den token_key generieren, während die beiden Werte eindeutig sind?

Zum Beispiel wenn:

  • token_id ist dfbs98641aretwsg
  • token_key ist sdf389dxbf1sdz51fga65dfg74asdf

Bedeutung:

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

Es kann keine andere Zeile in der Tabelle mit dieser Kombination von Token geben. Wie kann ich das machen?

8
user5486944

Ich würde vermeiden, ein zusätzliches Paket für einen Fall wie diesen aufzunehmen. So etwas wie:

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

... sollte tun. Ersetzen Sie den Modellnamen durch Ihren, falls er sich von 'Benutzer' unterscheidet, und verwenden Sie Ihre oder die vorgeschlagenen Funktionen zum Erstellen von Zufallszeichenfolgen.

14

Um die Token zu generieren, können Sie eine der folgenden Funktionen verwenden: Laravel's Helper Functions ; str_random().

Dadurch wird eine zufällige Zeichenfolge mit einer bestimmten Länge generiert, z. B. str_random(16) wird eine zufällige Zeichenfolge mit 16 Zeichen (Groß-, Klein- und Zahlen) generiert.

Müssen die Token, abhängig davon, wie Sie sie verwenden, wirklich absolut einzigartig sein? Angesichts der Tatsache, dass sie mit einem Benutzer übereinstimmen, oder ich nehme an, dass Sie den token_id Verwenden und diesen dann gegen den token_key Verifizieren, ist es wirklich wichtig, ob es eine Verdoppelung von einem von ihnen gibt? - obwohl die Chancen dafür extrem gering sind!

Wenn sie jedoch wirklich eindeutig sein müssen, können Sie immer einen Validator mit der Einschränkung unique verwenden. Mit dieses Paket können Sie auch testen, ob die beiden auch mit unique_with Eindeutig sind. Wenn der Validator fehlschlägt, generiert er nach Bedarf ein neues Token.

Anhand Ihrer Beispiele würden Sie str_random(16) für token_id Und str_random(30) für token_key Verwenden.

20
James

Folgender @ivanhoe-Vorschlag ... Folgendes habe ich mir ausgedacht: -

    $token = new Token;

    //in case there are duplicate
    for ($x = 0; $x < 10; $x ++) {
        $token->access_token = str_random(16);;
        try {
            if ($token->save()) {
                break;
            }
        }catch (QueryException $e) {

        }
    }
1
daisura99

Sie können dazu eine Abhängigkeit verwenden. Dirape Laravel-Token

Führen Sie den Befehl aus

composer require dirape/token

In Ihrem Controller verwenden

use Dirape\Token\Token;

Sie können es so verwenden:

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