从请求标头应用会话ID

时间:2017-02-23 12:07:11

标签: php symfony

我不确定Symfony是否可以这样做,所以我想出了一个问题。高级方案是:

  1. API上的请求(内置Symfony)必须在响应正文中返回 session-id
  2. 请求的来源必须在其标题中包含已返回的会话ID 以用于其后续请求
  3. API必须检查请求标头是否具有 session-id ,如果必须,则必须在Symfony会话中设置该会话
  4. 出于测试目的,我使用两个REST客户端作为浏览器实例:

    • 邮递员(Chrome)
    • HttpRequester(Firefox)

    以下是我所做的代码方法:

    邮递员的要求:

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

    使用HTTPFoundation Session,我通过以下方式设置会话:

    $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 设置为请求标头中的那个,因此我可以访问上一个响应中返回的上一个时间戳

    我创建了一个内核事件,因此我可以拦截请求并检查请求是否具有 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",
            ...
    

    我错过了什么?这可能吗?

1 个答案:

答案 0 :(得分:0)

你有没有试过这样的事情:

get

我在the documentation中看到有一个tokenizer.tokenize()功能,但我通常不会使用会话,因此我不知道这是否有效。

你能试试吗?