2015-10-25 13 views
5

Ho una tabella nel mio database chiamato keys che ha questa struttura:laravel: Genera casuale univoco del token

id | user_id | token_id | token_key 

Ogni volta che un utente accede al mio sito, ho bisogno di generare una nuova token_id e token_key set per quell'utente Come posso generare un token casuale per lo token_id e lo token_key mantenendo i due valori univoci?

Ad esempio, se:

  • token_id è dfbs98641aretwsg,
  • token_key è sdf389dxbf1sdz51fga65dfg74asdf

significato:

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

ci può essere altra riga nella tabella con quella combinazione di token. Come posso fare questo?

risposta

10

Eviterei di includere un pacchetto aggiuntivo per un caso come questo. Qualcosa di simile:

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

... dovrebbe fare. Sostituisci il nome del modello con il tuo, se diverso da "Utente", e usa le tue o suggerite funzioni per creare stringhe casuali.

+0

Ci può spiegare come il ciclo while garantirà lì vinto non ci sono duplicati? – user5486944

+0

In particolare, cosa fa 'instanceof' nel ciclo while? Il ciclo – user5486944

+2

['do-while'] (http://php.net/manual/en/control-structures.do.while.php) continuerà a" fare "finché l'istruzione in" while "viene valutata come' true '(e funzionerà almeno una volta, a differenza di' while-do'). In questo specifico esempio, genererà token id/coppia di chiavi, quindi proverà a trovare un utente nel database che ha quel token specifico e la coppia di chiavi. 'instanceof' verifica se il risultato è istanza della classe' User', il che significa che sta verificando se tale utente è stato trovato. In tal caso, 'do' eseguirà di nuovo e creerà un'altra coppia, e così via fino a quando non troverà nessun utente che abbia la coppia di id/chiave token generata. –

15

In termini di generazione dei token, è possibile utilizzare uno di Laravel's Helper Functions; str_random().

Questo genererà una stringa casuale di una lunghezza specificata, ad esempio str_random(16) genererà una stringa casuale di 16 caratteri (maiuscole, minuscole e numeri).

A seconda di come si utilizzano i token, è necessario che siano davvero unici? Dato che corrisponderanno a un utente, o presumo che potresti utilizzare lo token_id e quindi verificarlo contro lo token_key, è davvero importante se c'è un raddoppio di uno di essi? - anche se le possibilità di questo sono estremamente piccole!

Tuttavia, se si desidera che siano veramente unici, è sempre possibile utilizzare un validatore con il vincolo unique. Utilizzando this package potresti anche provare che entrambi sono ugualmente unici con unique_with. E poi se il validatore fallisce, allora genera un nuovo token secondo necessità.

basato fuori i tuoi esempi, si sarebbe utilizzando str_random(16) per token_id e str_random(30) per il token_key.

0

È possibile utilizzare una dipendenza per eseguire questa operazione.Dirape laravel-token

Eseguire il comando

composer require dirape/token 

Nel vostro utilizzo del controller

use Dirape\Token\Token; 

Si può usare in questo modo:

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