Применить идентификатор сессии из заголовка запроса

1

Я не уверен, что это возможно в Symfony, поэтому я придумал вопрос. Сценарий высокого уровня:

  1. Запрос API (встроенный в Symfony) должен возвращать идентификатор сеанса в теле ответа
  2. Происхождение запроса должно включать возвращаемый идентификатор сеанса в заголовке для последующего запроса
  3. API должен проверить, имеет ли заголовок запроса идентификатор сеанса, если он должен установить этот сеанс на сеансе Symfony

Для целей тестирования я использую два клиента REST для экземпляра браузера:

  • Почтальон (Chrome)
  • HttpRequester (Firefox)

Вот подход к коду, который я сделал:

Запрос от почтальона:

POST http://path.domain/api/url/
Content-Type: application/json
{
    "key": "value"
}

Используя сеанс HTTPFoundation, я установил сеанс:

$session = new Session();
$session->set('session-id', $session->getId());
$session->set('timestamp', time());

Затем верните его, вот ответ:

200 OK
Content-Type:  application/json
{
    "session-id": "1a69f956b8efc5ab465356e3257a3230",
    "timestamp": 1487850859
}

Теперь, чтобы имитировать другой ответ из другого экземпляра, я использую HttpRequester, но с идентификатором session в заголовке:

POST http://path.domain/api/url/
Content-Type: application/json
{
    "key": "value",
    "session-id": "1a69f956b8efc5ab465356e3257a3230"
}

Имея другой экземпляр запроса, я ожидаю, что Symfony будет генерировать новый сеанс (новое значение временной отметки). Но для моего случая я хотел установить идентификатор сеанса с идентификатором в заголовке запроса, поэтому я могу получить доступ к предыдущей отметке времени, как было возвращено в предыдущем ответе.

Я создал событие ядра, поэтому я могу перехватить запрос и выполнить проверку, если запрос имеет идентификатор сеанса, а затем выполняет настройку сеанса.

// Get all PHP global variables
$request = Request::createFromGlobals();

// Check if the request
if ($request->headers->has('session-id')) {
    $session = new Session();
    $session->setId($request->headers->get('session-id'));
}

Однако, если я это сделаю, я получаю ошибку:

"error": {
    "code": 500,
    "message": "Internal Server Error",
    "exception": [
      {
        "message": "Cannot change the ID of an active session",
        "class": "LogicException",
        ...

Что я упустил? Это возможно?

  • 1
    Рассматривали ли вы управление аутентификацией с помощью токена согласно этому руководству ? Вот как я сделал аутентификацию в моих REST API.
  • 0
    Да, посмотрите на JWT Auth и межсетевые экраны без сохранения состояния
Показать ещё 1 комментарий
Теги:

1 ответ

0

Вы пробовали что-то вроде этого:

if ($request->headers->has('session-id')) {
    $session = new Session();
    $session->start();

    $sess = $session->get('session-id');
    $session->set('session-id', $sess);
    ...
}

Я видел, что в документации есть функция get, но я обычно не использую сеансы, поэтому я не знаю, будет ли это работать или нет.

Вы можете попробовать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню