Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 20.08.2013 01:14:07

[L3] Расшифровать идентификатор пользователя из cookie?

Использую стандартный механизм авторизации Laravel 3. Появилась необходимость прочитать идентификатор пользователя который пишется в Cookie при успешной аутентификации, при этом НЕ имея самого фреймворка под рукой.

Вроде бы все просто, вызывается метод PHPCrypter::decrypt() идентификатор шифруется симметричным алгоритмом с использованием секретного ключа, т.е. зная сам ключ(который хранится в application/config/application.php) можно повторить внутренности PHPCrypter::decrypt()/encrypt() и получить идентификатор пользователя из Cookie.

Потому как не совсем понимаю все моменты в работе аутентификации порылся по фреймворку и нашел несколько вызовов PHPCrypter::decrypt() и попытался их воспроизвести:
laravel\session\drivers\cookie.php

PHP
$arr unserialize(Crypter::decrypt(\Laravel\Cookie::get('session_payload')));
echo 
Crypter::decrypt($arr['id']);    //вроде идентификатор пользователя

laravel\auth\drivers\driver.php

PHP
$arr explode('|'Crypter::decrypt('session_payload'));// $arr[0] - идентификатор пользователя

В обоих случаях выдает ошибку:

mcrypt_decrypt() [function.mcrypt-decrypt]: The IV parameter must be as long as the blocksize

Может кто-нибудь подскажет что я делаю не так?

Не в сети

#2 20.08.2013 07:17:21

Re: [L3] Расшифровать идентификатор пользователя из cookie?

Так ты всё-таки используешь фреймворк или нет? Не понятно — ты вызываешь Laravel\Cookie, и тут же — Crypter. Crypter — твой класс или тоже взят из Laravel?

В первом примере кода посмотри, что возвращает get().

Второй пример работать не будет, так как ты пытаешься расшифровать строку session_payload, а не значение cookie.

Не в сети

#3 21.08.2013 00:48:09

Re: [L3] Расшифровать идентификатор пользователя из cookie?

Да, фреймворк использую, PHPCrypter — класс Laravel.
Метод get() вернет следующее:

PHP
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.

Не в сети

#4 21.08.2013 07:28:59

Re: [L3] Расшифровать идентификатор пользователя из cookie?

Судя по всему ты распечатал значение $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 пользователя.

  1. Или же там хранится только идентификатор сессии,

Верно, поэтому твой подход с прямым чтением из cookie не переносим по двум моментам: сессия может хранится не в cookie, а драйвер авторизации может быть не eloquent. Поэтому если приложение под твоим контролем, то я бы посоветовал при входе в систему устанавливать отдельное cookie просто со значением ID пользователя. Тогда какие бы настройки не менялись эта cookie будет доступна из другого места и ты сможешь её прочитать. Кстати, даже не обязательно использовать Crypter — L3 подписывает значения cookie, то есть человек может его посмотреть, но не может изменить. Обычно ID пользователя — информация не секретная, так что я бы сделал именно так.

Не в сети

#5 22.08.2013 01:05:03

Re: [L3] Расшифровать идентификатор пользователя из cookie?

Да, дейсвительно 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) и не заморачиватся.

Не в сети

#6 22.08.2013 07:46:52

Re: [L3] Расшифровать идентификатор пользователя из cookie?

  1. т.е. зная сам ключ(который хранится в application/config/application.php) можно повторить внутренности PHPCrypter::decrypt()/encrypt()

Можно, тем более весь код Crypter умещается на одной-двух страницах, если убрать комментарии. Он очень короткий.

  1. PHP$value Request::foundation()->cookies->get($name)

Symfony. Можно считать это аналогом PHP$_COOKIE[$name].

  1. Пожалуй действительно стоит поставить дополнительную куку с идентификатором пользователя(разве что идентификатор пользователя все таки буду шифровать PHPmcrypt_encrypt/mcrypt_decrypt) и не заморачиватся.

Самый надёжный вариант. Я бы сделал именно так.

Не в сети

Подвал раздела