Сессия не инициируется с поста Guzzle Post - PullRequest
0 голосов
/ 17 октября 2018

Я интегрирую Laravel в устаревшее php-приложение.Страница входа использовалась для прямой публикации на verifyUser.php, который также запустил сеанс Symfony.

Новая архитектура теперь отправляет в API Laravel, который делает публикацию Guzzle в verifyUser.php.

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 голосов
/ 19 октября 2018

Публикация под моим ответом для отображения обновленного кода:

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']);
}
0 голосов
/ 17 октября 2018

Я предполагаю, что ваша устаревшая конечная точка использует куки для идентификации сеанса пользователя.

Успешный запрос к устаревшей конечной точке возвращает заголовок Set-Cookie.

Guzzle не перенаправляет этот заголовок Set-Cookie из ответа API в браузер - вам придется запрограммировать это поведение в приложении-оболочке.

Вам нужно будет указатьЖадно явно передавать соответствующий заголовок Cookie устаревшему API (для поддержания состояния входа пользователя) при отправке любых дальнейших запросов.

Для этого вам нужно сохранить этот файл cookie в вашем новом приложении (т. Е. В сеансе пользователя или в базе данных), а затем передать его в заголовок Cookie вместе со всеми последующими запросами, которые вы делаете.в устаревшем API.

...