Проблема с сессией при запросах к сайту в Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

Есть контроллер, к которому обращается сторонний сервис по HTTP последовательно. В первом запросе происходит basic авторизация, которая проходит успешно. Затем сервис делает отдельные запросы с различными mode: 'checkauth, init, file'. Записал в лог имя сессии и id при запросах.
2018-05-30 11:39:30 [185.98.85.252][10][-][info] mode=checkauth, name=PHPSHOPSESSID id=7qecub9vhhe9kdbn41o7uoke0t
2018-05-30 11:39:31 [185.98.85.252][10][-][info] mode=init, name=PHPSHOPSESSID id=0hdt4645sdimqcig9jfa473gnf
2018-05-30 11:39:32 [185.98.85.252][10][-][info] mode=file, name=PHPSHOPSESSID id=b3j5m590248t5d1flj3tppdsk9
2018-05-30 11:39:33 [185.98.85.252][10][o84uje1u52692o29bihthc36oa][info] mode=import, name=PHPSHOPSESSID id=o84uje1u52692o29bihthc36oa

Получается, что при каждом запросе новая сессия открывается. А мне надо чтобы как то одна сессия началась при mode=checkauth, так и оставалась, чтобы можно было при одном запросе записать переменную в сессию, а при других запросах использовать эти данные. В чем ошибка? Честно, до конца в сессиях не разобрался, но здесь может, какая-нибудь особенность Yii, связанная с basic авторизацией? Может надо как то правильно сессию начать, когда проходит авторизация? Или после авторизации надо как-то самому cockie создавать и отправлять её в ответ сервису?

Код: Выделить всё

<?php
class UnfController extends Controller
{
    public function beforeAction($action)
    {
        if (in_array($action->id, ['index'])) {
            $this->enableCsrfValidation = false;
        }
        return parent::beforeAction($action);
    }

    public function behaviors()
    {
        return [
            'basicAuth' => [
                'class' => \yii\filters\auth\HttpBasicAuth::className(),
                'auth' => function ($username, $password) {
                    $user = Admin::findByUsername( $username );
                    if ( $user->validatePassword( $password ) ) {
                        return $user;
                    }
                    return null;
                },
            ],
        ];
    }
    public function actionIndex()
    {
        $request = Yii::$app->request;
        $session = Yii::$app->session;

       if( $type == 'catalog' && $mode == 'checkauth' ){
            print "success\n".$session->getName()."\n".$session->getId()."\n"."_csrf-shop=".Yii::$app->request->csrfParam;
       
            Yii::info('mode=checkauth, name='.$session->getName().' id='.$session->getId() ,'1cunf');
            //2018-05-30 11:39:30 [185.98.85.252][10][-][info][1cunf] mode=checkauth, name=PHPSHOPSESSID id=7qecub9vhhe9kdbn41o7uoke0t
       }
       if( $type=='catalog' && $mode == 'init' ){
            Yii::info('mode=init, name='.$session->getName().' id='.$session->getId() ,'1cunf');
            //2018-05-30 11:39:31 [185.98.85.252][10][-][info][1cunf] mode=init, name=PHPSHOPSESSID id=0hdt4645sdimqcig9jfa473gnf
            
            $session->set('TEST_VAR' , 1234 ); //Хочу сохранить переменную сессию
       }
       if( $type == 'catalog' && $mode == 'file' ){
       	    Yii::info('mode=file, name='.$session->getName().' id='.$session->getId() ,'1cunf');
       	    //2018-05-30 11:39:32 [185.98.85.252][10][-][info][1cunf] mode=file, name=PHPSHOPSESSID id=b3j5m590248t5d1flj3tppdsk9
       	    
       	    $session->get('TEST_VAR');  // Выдаёт null
       }
Последний раз редактировалось Gleb_A 2018.05.30, 12:12, всего редактировалось 1 раз.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение mkramer »

Там, где ты образаешься к своему сайту по http, сохраняй после первого обращения куки, а потом передавай их. Например, если используешь Guzzle, то вот: http://docs.guzzlephp.org/en/stable/qui ... ie#cookies

Если простой curl, в сети тоже есть примеры, как сохранить куки.

P.S. Ты же в курсе, как работают сессии? И что там за куки?
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

mkramer писал(а): 2018.05.30, 12:11 Там, где ты образаешься к своему сайту по http, сохраняй после первого обращения куки, а потом передавай их. Например, если используешь Guzzle, то вот: http://docs.guzzlephp.org/en/stable/qui ... ie#cookies

Если простой curl, в сети тоже есть примеры, как сохранить куки.

P.S. Ты же в курсе, как работают сессии? И что там за куки?
Как работают сессии в курсе) Клиент обращается к серверу, устанавливается сессия. В ответ сервер шлёт куки с id сессии и в последующем клиент уже обращается с этой кукой к сайту. В моём случае я так понял, что сессия нормально не стартует, т.е. я её нормально не запускаю один раз при первом запросе. и она каждый раз при каждом новом запросе новая стартует.

Просто как это всё правильно сделать с учетом того, что ещё в behaviours basic авторизация. Сама ведь basic авторизация - это вообще другой уровень и происходит она до сессий на уровне сервера. Мне надо как то еще делать авторизацию и старт сессии в ручную в приложении?
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение mkramer »

Ещё раз. Куки хранятся на клиенте, и клиент шлёт их на сервер с каждом запросом. Ты сделал в своём клиенте, чтобы куки слались с каждым запросом? Покажи код клиента
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

mkramer писал(а): 2018.05.30, 12:51 Ещё раз. Куки хранятся на клиенте, и клиент шлёт их на сервер с каждом запросом. Ты сделал в своём клиенте, чтобы куки слались с каждым запросом? Покажи код клиента
Там при первом запросе проходит basic авторизация и в ответ клиенту отправляется ID текущей сессии во время этого запроса и в последующем клиент уже обращается с кукой, где ID прописан постоянный 'PHPSHOPSESSID' => 'ubj6488ui5cd0us8tc5fl6v9s7'.

Код: Выделить всё

if( $type == 'catalog' && $mode == 'checkauth' ){
            print "success\n".$session->getName()."\n".$session->getId()."\n"."_csrf-shop=".Yii::$app->request->csrfParam;
       
            Yii::info('mode=checkauth, name='.$session->getName().' id='.$session->getId() ,'1cunf');
            //2018-05-30 11:39:30 [185.98.85.252][10][-][info][1cunf] mode=checkauth, name=PHPSHOPSESSID id=7qecub9vhhe9kdbn41o7uoke0t
       }
Как мне авторизацию тогда допилить и где?
Код клиента не посмотреть. Это я под него подстраиваюсь.Клиент шлёт вот такой запрос к моему серверу:

Код: Выделить всё

2018-05-30 10:12:54 [185.98.85.252][10][r1h7ta2328o6ibkauqsdacf5nf][info][application] $_GET = [
    'type' => 'catalog'
    'mode' => 'file'
    'filename' => 'v8_Zf0uD8_182ee.zip'
]

$_POST = []

$_FILES = []

$_COOKIE = [
    'PHPSHOPSESSID' => 'ubj6488ui5cd0us8tc5fl6v9s7'
]
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение mkramer »

О, только заметил. Клиент шлёт куку PHPSHOPSESSID. У тебя где-то прописано создавать именно такую куку?

Базовая аутентификация к сессиям не имеет никакого отношения, в принципе
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

mkramer писал(а): 2018.05.30, 13:12 О, только заметил. Клиент шлёт куку PHPSHOPSESSID. У тебя где-то прописано создавать именно такую куку?

Базовая аутентификация к сессиям не имеет никакого отношения, в принципе
Нет. нигде не прописано. Я сам принцип не понимаю здесь. Мне ведь не куку создать надо, а сессию.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение mkramer »

Ну сессионную куку клиент должен прислать, а твой скрипт должен её распознать именно как сессионную. Посмотри, куку с каким именем создаёт твой клиент. Кто создаёт такую куку? Или ты создаёшь куку, а клиент тебе её не присылает, поэтому ты не можешь стартануть сессию, либо клиент ожидает другого session id. С разработчиком клиента никак не связаться? Документации по взаимодействию с ним нету?
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

mkramer писал(а): 2018.05.30, 14:12 Ну сессионную куку клиент должен прислать, а твой скрипт должен её распознать именно как сессионную. Посмотри, куку с каким именем создаёт твой клиент. Кто создаёт такую куку? Или ты создаёшь куку, а клиент тебе её не присылает, поэтому ты не можешь стартануть сессию, либо клиент ожидает другого session id. С разработчиком клиента никак не связаться? Документации по взаимодействию с ним нету?
Клиент - это 1С http://v8.1c.ru/edi/edi_stnd/131/.

Получилось так сделать: брать из куки id сессии и менять её на сервере. Но как то это костыльно, мне кажется

Код: Выделить всё

if(isset($_COOKIE['PHPSHOPSESSID'])){
            $session->setId( $_COOKIE['PHPSHOPSESSID']);
        }
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение mkramer »

http://<сайт>/<путь> /1c_exchange.php?type=catalog&mode=checkauth.

В ответ система управления сайтом передает системе «1С:Предприятие» три строки (используется разделитель строк "\n"):

слово "success";
имя Cookie;
значение Cookie.
По твоей ссылке. Где это у тебя? Ты сам можешь передать нужное имя куки и значение.
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

mkramer писал(а): 2018.05.30, 15:11
http://<сайт>/<путь> /1c_exchange.php?type=catalog&mode=checkauth.

В ответ система управления сайтом передает системе «1С:Предприятие» три строки (используется разделитель строк "\n"):

слово "success";
имя Cookie;
значение Cookie.
По твоей ссылке. Где это у тебя? Ты сам можешь передать нужное имя куки и значение.

Код: Выделить всё

if( $type == 'catalog' && $mode == 'checkauth' ){
            print "success\n".
                     $session->getName()."\n".  //Имя куки
                     $session->getId()."\n".                         // Значение куки
                     "_csrf-shop=".Yii::$app->request->csrfParam;
       
            Yii::info('mode=checkauth, name='.$session->getName().' id='.$session->getId() ,'1cunf');
            //2018-05-30 11:39:30 [185.98.85.252][10][-][info][1cunf] mode=checkauth, name=PHPSHOPSESSID id=7qecub9vhhe9kdbn41o7uoke0t
       }
Так и делаю. Но при последующих запросах сессия то новая уже стартует с другим id
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение mkramer »

Т.е. там реально несколько строк? Ну я бы задалбывал поддержку 1C
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

mkramer писал(а): 2018.05.30, 22:53 Т.е. там реально несколько строк? Ну я бы задалбывал поддержку 1C
Да у всех вроде работает. А вот с сайтом на Yii есть какая то особенность, наверное. У Yii используется автостарт сессии. Поэтому она каждый раз новая при каждом запросе и стартует. А мне надо в первом запросе от 1С сессию начать и при последующих туже самую использовать.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение urichalex »

Оффтоп
У них даже xml на русском...
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение mkramer »

Gleb_A писал(а): 2018.05.31, 08:10 У Yii используется автостарт сессии. Поэтому она каждый раз новая при каждом запросе и стартует.
Ну тогда бы никакая аутентификация не работала на Yii, не правда ли? К тому же, там просто стандартные сессии php по дефолту.

Как вариант - используйте свою куку конкретно для 1C, в обход механизма сессий Yii и php
Gleb_A
Сообщения: 120
Зарегистрирован: 2012.02.26, 18:29

Re: Проблема с сессией при запросах к сайту в Yii2

Сообщение Gleb_A »

mkramer писал(а): 2018.05.31, 11:41
Gleb_A писал(а): 2018.05.31, 08:10 У Yii используется автостарт сессии. Поэтому она каждый раз новая при каждом запросе и стартует.
Ну тогда бы никакая аутентификация не работала на Yii, не правда ли? К тому же, там просто стандартные сессии php по дефолту.

Как вариант - используйте свою куку конкретно для 1C, в обход механизма сессий Yii и php
так и пришлось всё вручную сделать со своей кукой.
оффтоп. хочется от 1С уже какой нибудь REST api
Ответить