Laravel 8 в iOS: сбился сеанс и не может восстановить его

#ios #laravel #session

Вопрос:

Простая цепочка кода и разметки Laravel:

 // Initial route
public function play(Request $request)
{
    ...
    $test = session('test');
    session()->keep(['test']);
    $sid = session()->getId();
    Log::debug('session ID before card = ' . session()->getId());
    Log::debug('session before card = ' . print_r(session()->all(), true));
    return view('front.intro', compact('test', 'sid'));
}

// front.intro view excerpt
@section('content')
    <form role="form" method="get"
          action="{{ route('player.card') }}">
        @csrf
        <input type="hidden" name="sid" value="{{ $sid }}">
        ...
    </form>
@endsection

// Subsequent route
public function card(Request $request)
{
    Log::debug('session ID inside card = ' . session()->getId());
    if($request->has('sid')) {
        if($request->sid != session()->getId()) {
            Log::debug('session before restore = ' . print_r(session()->all(), true));
            session()->setId($request->sid);
            Log::debug('session ID restored = ' . session()->getId());
            Log::debug('session after restore = ' . print_r(session()->all(), true));
        }
    }
    ...
}
 

Эти коды приводят к следующему входу в систему iOS:

 #1: [2021-08-27 04:44:38] local.DEBUG: session ID before card = CWkcUIQPtrrlpFINh10QJ9JpuTgI4zrOWzyiaxCP  
#2: [2021-08-27 04:44:38] local.DEBUG: session before card = Array
(
    [_token] => fQvKNapYOBqlSTc8h0aDEB2f1Nl0SP6bnYQz3OOd
    [test] => AppModelsTest Object ...
    [mkey] => ...
    [_flash] => ...
)
#3: [2021-08-27 04:44:43] local.DEBUG: session ID inside card = wGIfFgkmyJscg2tl8v5nYt4tpmYihokP2sO3aB83  
#4: [2021-08-27 04:44:43] local.DEBUG: session before restore = Array
(
    [_token] => 7aGPu7a8XWYgUANCzSTWKSqRz8QwT66gWAUKX31w
)
  
#5:  [2021-08-27 04:44:43] local.DEBUG: session ID restored = CWkcUIQPtrrlpFINh10QJ9JpuTgI4zrOWzyiaxCP  
#6: [2021-08-27 04:44:43] local.DEBUG: session after restore = Array
(
    [_token] => 7aGPu7a8XWYgUANCzSTWKSqRz8QwT66gWAUKX31w
)
 

Дайджест:

  • В Windows, Mac и Android идентификатор сеанса остается прежним (#1 == #3), поэтому данные сеанса никогда не изменялись (#2 == #4). Отличная работа!
  • В сеансе iOS включите новый (#1 != #3), поэтому данные сеанса были удалены (#2 != #4). keep не имеет никакого эффекта. И переключитесь на предыдущую сессию, не восстанавливайте данные предыдущей сессии (#2 != #6).

Можно ли предотвратить создание новой сессии в iOS ?

Или меньше — как восстановить старые данные сеанса Laravel по сохраненному идентификатору сеанса ?

Обновить:

I can restore old session by adding session start after setId:

 session()->setId($request->sid);
session()->start();
 

But root of problem (start new session at iOS) remains open.