J'ai une table dans ma base de données appelée keys
qui a cette structure:
id | user_id | token_id | token_key
Chaque fois qu'un utilisateur se connecte à mon site, je dois générer un nouvel ensemble token_id
et token_key
pour cet utilisateur. Comment générer un jeton aléatoire pour le token_id
et le token_key
tout en conservant les deux valeurs uniques?
Par exemple, si:
token_id
est dfbs98641aretwsg
, token_key
est sdf389dxbf1sdz51fga65dfg74asdf
Sens:
id | user_id | token_id | token_key
1 | 1 | dfbs98641aretwsg | sdf389dxbf1sdz51fga65dfg74asdf
Il ne peut y avoir aucune autre ligne dans la table avec cette combinaison de jetons. Comment puis-je faire ceci?
J'éviterais d'inclure un paquet supplémentaire pour un cas comme celui-ci. Quelque chose comme:
do {
$token_id = makeRandomToken();
$token_key = makeRandomTokenKey();
} while (User::where("token_id", "=", $token_id)->where("token_key", "=", $token_key)->first() instanceof User);
...devrait faire. Remplacez le nom du modèle par le vôtre, s'il est différent de "Utilisateur", et utilisez les fonctions que vous avez suggérées pour créer des chaînes aléatoires.
En suivant la suggestion de @ivanhoe ... voici ce que j’ai trouvé: -
$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) {
}
}
Vous pouvez utiliser une dépendance pour le faire. Dirape laravel-token
Lancer la commande
composer require dirape/token
Dans votre contrôleur utiliser
use Dirape\Token\Token;
Vous pouvez l'utiliser comme ceci:
User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'token_key' => (new Token())->Unique('users', 'api_token', 60),
'active' => 1
])