web-dev-qa-db-fra.com

Laravel: Générer un jeton unique aléatoire

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?

8
user5486944

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.

14
Oliver Maksimovic

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) {

        }
    }
1
daisura99

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
    ])
0