Php 从请求头应用会话id
我不确定这在Symfony中是否可行,所以我提出了一个问题。高级别场景是:Php 从请求头应用会话id,php,symfony,Php,Symfony,我不确定这在Symfony中是否可行,所以我提出了一个问题。高级别场景是: 对API(内置Symfony)的请求必须返回响应正文上的会话id 请求的来源必须在其头上包含返回的会话id,以供后续请求使用 API必须检查请求头是否具有会话id,如果有,则必须在Symfony会话上设置该会话 出于测试目的,我正在使用两个REST client For browser实例: 邮递员(铬) HttpRequester(Firefox) 以下是我对代码的处理方法: 邮递员的要求: POST http:/
- 邮递员(铬)
- 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和无状态防火墙。其中有一个用户名,我不需要。我只是希望能够灵活地从另一个实例获取会话。