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?
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.
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.
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) {
}
}
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
])