2015-10-25 1 views
5

У меня есть таблица в моей базе данных называется keys, что имеет такую ​​структуру:Laravel: Генерация случайных уникальный маркер

id | user_id | token_id | token_key 

Каждый раз, когда пользователь входит в мой сайт, мне нужно, чтобы создать новый token_id и token_key набор для этого пользователя. Как я могу сгенерировать случайный токен как для token_id, так и для token_key, сохраняя при этом два значения?

Например, если:

  • token_id является dfbs98641aretwsg,
  • token_key является sdf389dxbf1sdz51fga65dfg74asdf

Значение:

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

Там не может быть никакой другой строки в таблице с это комбинация жетонов. Как я могу это сделать?

ответ

10

Я бы не стал включать дополнительный пакет для случая, подобного этому. Что-то вроде:

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

... необходимо. Замените имя модели вашим, если оно отличается от «Пользователь», и используйте ваши или предлагаемые функции для создания случайных строк.

+0

Можете ли вы объяснить, как цикл в то время как будет гарантировать там выиграл «Есть ли дубликаты? – user5486944

+0

В частности, что делает 'instanceof' в цикле while? – user5486944

+2

['do-while'] (http://php.net/manual/en/control-structures.do.while.php) цикл будет продолжать« делать », если оператор« while »оценивается как« true » '(и он будет работать хотя бы один раз, в отличие от' while-do'). В этом конкретном примере он будет генерировать пару id/key токенов, тогда он попытается найти пользователя в базе данных, имеющей определенную пару токенов и ключей. 'instanceof' проверяет, является ли результат экземпляром класса' User', что означает, что он проверяет, найден ли такой пользователь. Если это так, 'do' будет выполняться снова и сделать еще пару, и так далее, пока не найдет никакого пользователя, имеющего сгенерированную пару идентификатора/ключа token. –

15

С точки зрения генерации токенов, вы можете использовать один из Laravel's Helper Functions; str_random().

Это будет генерировать случайную строку определенной длины, например str_random(16) будет генерировать случайную строку из 16 символов (верхний регистр, строчный регистр и цифры).

В зависимости от того, как вы используете токены, действительно ли они должны быть полностью уникальными? Учитывая, что они будут соответствовать пользователю, или я предполагаю, что вы можете использовать token_id, а затем проверить это на token_key, действительно ли имеет значение, если есть двойной вариант одного из них? - хотя шансы на это чрезвычайно малы!

Однако, если вы действительно хотите, чтобы они были действительно уникальными, вы всегда можете использовать валидатор с ограничением unique. Используя this package, вы также можете проверить, что оба из них уникальны также с unique_with. И тогда, если валидатор терпит неудачу, тогда он генерирует новый токен по мере необходимости.

Исходя из ваших примеров, вы использовали бы str_random(16) для token_id и str_random(30) для token_key.

0

Для этого вы можете использовать зависимость.Dirape laravel-token

Выполните команду

composer require dirape/token 

В вашем использовании контроллера

use Dirape\Token\Token; 

Вы можете использовать его как это:

User::create([ 
     'name'    => $data['name'], 
     'email'   => $data['email'], 
     'password'   => bcrypt($data['password']), 
     'token_key' => (new Token())->Unique('users', 'api_token', 60), 
     'active'   => 1 
    ]) 
Смежные вопросы