应用请求标题的会话ID



我不确定这是否可以在symfony中,所以我提出了一个问题。高级场景是:

  1. API上的请求(构建为Symfony)必须在响应主体上返回 session-id
  2. 请求的起源必须在其成功请求
  3. 的标题上包括返回的 session-id
  4. API必须检查请求标头是否具有 session-id ,如果这样做必须在Symfony Session上设置该会话

出于测试目的,我正在为浏览器实例使用两个REST客户端:

  • Postman(Chrome)
  • httprequester(firefox)

这是我所做的代码的方法:

Postman的请求:

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-id

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

通过具有不同的请求实例,我希望Symfony会生成新的会话(新的时间戳值)。但是对于我的情况,我想使用请求标题中的一个设置会话ID ,以便我可以访问上一个响应中返回的上一个 timestamp 。P>

我创建了一个内核事件,以便我可以拦截请求并检查请求是否具有 session-id 然后进行会话设置。

// 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",
        ...

我想念什么?这可能吗?

您是否尝试过这样的事情:

if ($request->headers->has('session-id')) {
    $session = new Session();
    $session->start();
    $sess = $session->get('session-id');
    $session->set('session-id', $sess);
    ...
}

我在文档中看到了get函数,但我通常不使用会话,所以我不知道这是否会起作用。

您可以尝试吗?

最新更新