会话未从Guzzle Post启动

时间:2018-10-17 18:57:03

标签: php laravel symfony session guzzle

我正在将Laravel集成到旧版php应用程序中。登录页面曾经直接发布到verifyUser.php,这也启动了Symfony会话。

新架构现在发布到了laravel api,该laravel api在verifyUser.php上发布了Guzzle。

javascript:

$(document).ready(function(){
  $('#signIn').submit(function(){
    var a = $('#email').val();  
    $.post('/api/login', { //this used to post to verifyUser.php
      Username: $('#email').val(),
      Password: $('#password').val()
    }, function(data){
      if(data['credentials'] == true){
          console.log('credentials true');
          console.log(data['uri']);
          window.location.href=data['uri'];
      } else {
        $('#errMsg').html(data['errMsg']);
        $('.alert').show();
      }
    }, 'json');
    return false;
  });

控制器功能:

public function authenticate(Request $request) //aka api/login endpoint
{
    //...
            $legacyRes = $this->authenticateLegacy($request);
    //...
}


private function authenticateLegacy(Request $request)
{
    $response = null;
    try {
        $response = $this->client->post('/admin/verifyUser.php', [
            'form_params' => ['Username' => $request->get('Username'),
                'Password' => $request->get('Password')]
        ]);
    }
    catch(Exception $exception){
        Log::error('Errrererererer', [$exception->getMessage()]);
    }
    $body = (string)$response->getBody();
    Log::info('BODY:', [$body]);
    return $body;

}

我已经删除了verifyUser.php,因为我已经对其进行了测试,并且它返回了预期的结果。

使用浏览器时,似乎未设置会话信息。但是根据我的帖子回复,一切都应该正常进行。 这是因为我正在通过枪口路由请求吗?

2 个答案:

答案 0 :(得分:1)

我假设您的旧式端点使用cookie来标识用户的会话。

对旧式端点的成功请求返回一个Set-Cookie头。

Guzzle不会将此API响应中的Set-Cookie头转发到浏览器-您必须将此行为编程到“包装”应用程序中。

在发送其他任何请求时,您将需要让guzzle显式地将相应的Cookie头传递给旧式api(以维持用户的登录状态)。

要实现此目的,您需要将此Cookie保存在新应用程序中(即,在用户的会话中或数据库中),然后将其传递到Cookie标头中以及您对旧版API。

答案 1 :(得分:1)

在我的回答下发布以显示更新的代码:

private function authenticateLegacy(Request $request)
{
    //...
    //parse cookie id from guzzle response
    $body = (string)$response->getBody();
    $cookie = $response->getHeader('Set-Cookie'); //PHPSESSID=SOMEID; path=/
    $cookieBite = explode(';', $cookie)[0]; ////PHPSESSID=SOMEID
    $cookieId = explode('=', $cookieBite)[1];

    $data = json_decode($body, true);
    $data['session'] = $cookieId;
    return $data;
}

动作中:

public function authenticate(Request $request)
{
    //...
            $legacyRes = $this->authenticateLegacy($request);
    //...
    // this will have the session id in the body but will also 
    // set the cookie for the client so I don't have 
    // to set document.cookie w/ js
    return response($legacyRes, 200)
     ->withCookie('PHPSESSID', $legacyRes['session']);
}