Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Использую стандартный механизм авторизации Laravel 3. Появилась необходимость прочитать идентификатор пользователя который пишется в Cookie при успешной аутентификации, при этом НЕ имея самого фреймворка под рукой.
Вроде бы все просто, вызывается метод PHPCrypter::decrypt()
идентификатор шифруется симметричным алгоритмом с использованием секретного ключа, т.е. зная сам ключ(который хранится в application/config/application.php) можно повторить внутренности PHPCrypter::decrypt()/encrypt()
и получить идентификатор пользователя из Cookie.
Потому как не совсем понимаю все моменты в работе аутентификации порылся по фреймворку и нашел несколько вызовов PHPCrypter::decrypt()
и попытался их воспроизвести:
laravel\session\drivers\cookie.php
$arr = unserialize(Crypter::decrypt(\Laravel\Cookie::get('session_payload')));
echo Crypter::decrypt($arr['id']); //вроде идентификатор пользователя
laravel\auth\drivers\driver.php
$arr = explode('|', Crypter::decrypt('session_payload'));// $arr[0] - идентификатор пользователя
В обоих случаях выдает ошибку:
mcrypt_decrypt() [function.mcrypt-decrypt]: The IV parameter must be as long as the blocksize
Не в сети
Так ты всё-таки используешь фреймворк или нет? Не понятно — ты вызываешь Laravel\Cookie, и тут же — Crypter. Crypter — твой класс или тоже взят из Laravel?
В первом примере кода посмотри, что возвращает get().
Второй пример работать не будет, так как ты пытаешься расшифровать строку session_payload, а не значение cookie.
Не в сети
Да, фреймворк использую, PHPCrypter
— класс Laravel.
Метод get() вернет следующее:
array (size=3)
'id' => string 'v9mvGtZd5hH7MoXAoyRGPrwEW0nzyTuJWal9hYfo' (length=40)
'data' =>
array (size=4)
':new:' =>
array (size=0)
empty
':old:' =>
array (size=0)
empty
'csrf_token' => string 'XIcPGCUYCxK8tmnNaFY5dtqS8RrAK0BZbgoudijW' (length=40)
'laravel_auth_drivers_eloquent_login' => int 1
'last_activity' => int 1377033363
где, ’id’ ⇒ string ’v9mvGtZd5hH7MoXAoyRGPrwEW0nzyTuJWal9hYfo’ — предположительно необходимый мне идентификатор пользователя
Мне еще интересно, верна ли моя догадка, действительно ли Laravel сохраняет идентификатор пользователя в Cookie ?(где то же берется идентификатор пользователя при вызове PHPAuth::user()->id
). Или же там хранится только идентификатор сессии, которая в свою очередь хранится в зависимости от выставленной опции driver в application/config/session.php.
Не в сети
Судя по всему ты распечатал значение $arr, а я имел в виду PHP\Laravel\Cookie::get('session_payload')
, ну да ладно.
id — это ID сессии; ты ведь читаешь session_payload. Этот ID — случайная строка из 40 символов, можешь посмотреть как она генерируется в session.php. Шифруется только значение cookie, ничего внутри уже зашифрованного массива не шифруется, так как нет смысла.
Для получения именно ID пользователя тебе нужно прочитать из массива PHP$arr['data']['laravel_auth_drivers_eloquent_login']
— если ты используешь авторизацию eloquent, то это будет ID пользователя.
- Или же там хранится только идентификатор сессии,
Верно, поэтому твой подход с прямым чтением из cookie не переносим по двум моментам: сессия может хранится не в cookie, а драйвер авторизации может быть не eloquent. Поэтому если приложение под твоим контролем, то я бы посоветовал при входе в систему устанавливать отдельное cookie просто со значением ID пользователя. Тогда какие бы настройки не менялись эта cookie будет доступна из другого места и ты сможешь её прочитать. Кстати, даже не обязательно использовать Crypter — L3 подписывает значения cookie, то есть человек может его посмотреть, но не может изменить. Обычно ID пользователя — информация не секретная, так что я бы сделал именно так.
Не в сети
Да, дейсвительно PHP$arr['data']['laravel_auth_drivers_eloquent_login']
идентификатор пользователя необходымый мне.
Странно что я этого сразу не заметил, надо быть внимательнее)))
Вроде бы все просто, вызывается метод
PHPCrypter::decrypt()
идентификатор шифруется симметричным алгоритмом с использованием секретного ключа, т.е. зная сам ключ(который хранится в application/config/application.php) можно повторить внутренностиPHPCrypter::decrypt()/encrypt()
и получить идентификатор пользователя из Cookie
— тут я слегка поторопился, в методе PHPCookie::get()
есть интересный вызов: PHP$value = Request::foundation()->cookies->get($name)
и я плохо себе представляю что тут происходит. Что это такое и как оно работает?
Пожалуй действительно стоит поставить дополнительную куку с идентификатором пользователя(разве что идентификатор пользователя все таки буду шифровать PHPmcrypt_encrypt/mcrypt_decrypt
) и не заморачиватся.
Не в сети
- т.е. зная сам ключ(который хранится в application/config/application.php) можно повторить внутренности
PHPCrypter::decrypt()/encrypt()
Можно, тем более весь код Crypter умещается на одной-двух страницах, если убрать комментарии. Он очень короткий.
PHP$value = Request::foundation()->cookies->get($name)
Symfony. Можно считать это аналогом PHP$_COOKIE[$name]
.
- Пожалуй действительно стоит поставить дополнительную куку с идентификатором пользователя(разве что идентификатор пользователя все таки буду шифровать
PHPmcrypt_encrypt/mcrypt_decrypt
) и не заморачиватся.
Не в сети