Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从请求头应用会话id_Php_Symfony - Fatal编程技术网

Php 从请求头应用会话id

Php 从请求头应用会话id,php,symfony,Php,Symfony,我不确定这在Symfony中是否可行,所以我提出了一个问题。高级别场景是: 对API(内置Symfony)的请求必须返回响应正文上的会话id 请求的来源必须在其头上包含返回的会话id,以供后续请求使用 API必须检查请求头是否具有会话id,如果有,则必须在Symfony会话上设置该会话 出于测试目的,我正在使用两个REST client For browser实例: 邮递员(铬) HttpRequester(Firefox) 以下是我对代码的处理方法: 邮递员的要求: POST http:/

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

  • 对API(内置Symfony)的请求必须返回响应正文上的会话id
  • 请求的来源必须在其头上包含返回的会话id,以供后续请求使用
  • API必须检查请求头是否具有会话id,如果有,则必须在Symfony会话上设置该会话
  • 出于测试目的,我正在使用两个REST client For browser实例:

    • 邮递员(铬)
    • 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,但在头上有会话id

    POST http://path.domain/api/url/
    Content-Type: application/json
    {
        "key": "value",
        "session-id": "1a69f956b8efc5ab465356e3257a3230"
    }
    
    通过使用不同的请求实例,我希望Symfony将生成新会话(新的时间戳值)。但是对于我的情况,我想用请求头中的id设置会话id,这样我就可以访问上一个响应中返回的上一个时间戳

    我创建了一个内核事件,以便拦截请求并检查请求是否具有会话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
    函数,但我通常不使用会话,所以我不知道这是否有效


    你能试试吗?

    你试过这样的东西吗:

    if ($request->headers->has('session-id')) {
        $session = new Session();
        $session->start();
    
        $sess = $session->get('session-id');
        $session->set('session-id', $sess);
        ...
    }
    
    我在中看到了一个
    get
    函数,但我通常不使用会话,所以我不知道这是否有效


    您能试试吗?

    您是否考虑过按照管理令牌身份验证?这就是我在RESTAPI中进行身份验证的方式。是的,请查看JWT Auth和无状态防火墙。其中有一个用户名,我不需要。我只是希望能够灵活地从另一个实例获取会话。您是否考虑过按照管理令牌身份验证?这就是我在RESTAPI中进行身份验证的方式。是的,请查看JWT Auth和无状态防火墙。其中有一个用户名,我不需要。我只是希望能够灵活地从另一个实例获取会话。