Создание сессии при запуске по крону скриптов из админки

Тема в разделе "OpenCart", создана пользователем cherkas, 26 ноя 2016.

  1. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Здравствуйте, может кто то подскажет как можно прописать сессию для магазина, что бы их было две

    т.е.

    одна обычная, а вторая всё время одинаковая

    скажем &token=123456789101112131415...

    или любая другая, что бы ее можно было написать руками

    т.е. опенкарт проверяет подходящая ли сессия обычная

    если нет

    то подходящая ли сессия необычная

    если подходящая то пропускает


    нужно для крона.


    а еще лучше, убирать авторизацию и сессию если запрос поступил от сервера на котором находиться сайт
    что то типа такого

    Код:
    if (gethostbyname($_SERVER['HTTP_HOST'])==$_SERVER['REMOTE_ADDR'])
    ...
    если условие соблюдается, то работает без токенов и авторизации
     
    Последнее редактирование: 26 ноя 2016
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Речь идёт о сессиях админки (судя по токену)? В любом случае, для крона это неправильный подход. У крона должна быть отдельная точка входа, недоступная через браузер, а потому без необходимости авторизации средствами ОК.
    Чтоб закрыть доступ из браузера, достаточно в начале входного скрипта для крона добавить такой код:

    PHP:
    if (!isset($argv) || $argv[1] !== 'some_key') {
        
    header("HTTP/1.1 403 Forbidden"true403);
        exit(
    '403');
    }
    Вместо some_key - ключ (набор символов), который нужно дописать к строке запуска скрипта по крону.
     
  3. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57

    так не подходит, запускать нужно обычный модуль.
    т.е. просто перейти по ссылке, но эта ссылка с токеном
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Так можно запускать, что угодно. Отдельная точка входа - это значит взять index.php и модифицировать его для работы через крон, а дальше можно будет запустить всё, что можно запустить через браузер.

    В случае с админкой нужно ещё дописать в index.php после:
    PHP:
    $registry->set('user', new User($registry));
    это:
    PHP:
    $registry->get('user')->login(__username____password__);
    $registry->get('session')->data['token'] = md5(mt_rand());
    Вместо __username__ и __password__ - логин и пароль пользователя админки.
    И при каждом запуске будет происходить логин.
     
  5. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    не понял сути, если можно подробнее расскажите что к чему и как это работает.


    скажем мне нужно по крону запустить ссылку

    /admin/index.php?route=модуль&token=5b22280f65357108b9114a13fd733bae&параметры_модуля

    без токена она не работает

    нужно что был один и тот же токен всё время, тогда я смогу записать эту ссылку в крон для перерода по ней

    либо должно для сервера работать без токена

    /admin/index.php?route=модуль&параметры_модуля
     
    Последнее редактирование: 26 ноя 2016
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    С точки зрения ссылки оно и будет без токена.
    Только ссылка будет - /admin/index_cron.php?route=модуль&параметры_модуля
    А index_cron.php - это клон обычного index.php с правками, которые я написал выше.

    При каждом запуске этого файла будет происходить логин пользователя и записываться новый токен в сессию. На самом деле, можно было бы даже токен не записывать в сессию, для проверки прав используются данные полученные классом User из базы при логине, но без токена в сессии могут в некоторых местах выскакивать ошибки типа неопределённого индекса "токен".
     
    cherkas нравится это.
  7. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Здравствуйте, добрался я до всего этого наконец, и пока добирался сменил опенкарт с версии 1.5 на версию 2.3 (опенкарт.про). Открыл фаил admin/index.php

    а там

    PHP:
    <?php
    // Version
    define('VERSION''2.3.0.2.1');

    // Configuration
    if (is_file('config.php')) {
        require_once(
    'config.php');
    }

    // Install
    if (!defined('DIR_APPLICATION')) {
        
    header('Location: ../install/index.php');
        exit;
    }

    // Startup
    require_once(DIR_SYSTEM 'startup.php');

    start('admin');
    и всё

    подскажите пожалуйста, как в таком случае быть.
     
  8. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Возвращаться на 1.5 :Smile:
    Либо учить архитектуру 2.3 (именно 2.3, потому что тут в разных версиях двойки по разному).

    Там большая часть кода из старого index.php теперь в /system/framework.php.

    Тут, наверное, придётся клонировать не только index.php, но и ещё /system/startup.php и /system/framework.php, поскольку правки нужно делать в framework, а он третий в этой цепочке.
     
  9. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57

    Да я бы с 1.5 и не уходил, шаблон хороший на глаза попался, а он только для 2. Пришлось так сказать переступить через себя :Sad:
     
  10. ChipZip

    ChipZip

    Регистрация:
    1 фев 2018
    Сообщения:
    14
    Симпатии:
    0
    Добрый день.
    Подскажите пожалуйста более конкретно, что и где поменять, а то я совсем не понимаю где и что.
     
  11. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Я тоже совсем не понимаю... что вы спрашиваете!
    Напишите конкретно, что вы пытаетесь сделать, в каком месте возникли сложности и какая у вас версия ОК (с точностью до второй цифры).
     
  12. ChipZip

    ChipZip

    Регистрация:
    1 фев 2018
    Сообщения:
    14
    Симпатии:
    0
    ocStore 2.3.0.2.3
    Хочу сделать чтобы Крон (Планировщик заданий) запускал по расписанию ссылку https://site.ru/admin/index.php?rou...HwUap1NuAoLSeHHF9egvakUxrrFf&form_id=1&page=1
    т.к. ссылка должна запускаться из под админской записи то токен должен быть каждый раз новый.
    Хотелось бы как то реализовать получение нового токена и подстановку в ссылку.

    Суть всего для чего это нужно.
    в ИМ установлен модуль парсинга прайс-листа из .xml файла в каталог ИМ.
    Объем около 30.000 позиций.
    На сервере каждые 2 мин обрыв связи. В связи с этим нужно запускать парсинг повторно каждые 2 мин. (Модуль стартует не сначала, а с момента обрыва соединения)
    Если это делать вручную то на это уйдёт примерно 5 часов. Поэтому хотел чтоб всё делалось на сервере в ночь.
     
  13. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    В ссылку подставлять ничего не надо, надо всё делать внутри.
    Вам нужно сделать клоны файлов /admin/index.php, /system/startup.php и /system/framework.php, и в framework после
    PHP:
    $registry->set('user', new User($registry));
    добавить это:
    PHP:
    $registry->get('user')->login(__username____password__);
    $registry->get('session')->data['token'] = md5(mt_rand());
    А из ссылки токен убрать. И ссылка будет уже не на index.php, а на клонированный файл.
     
  14. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    В OcStore 2.3.0.2
    PHP:
    $registry->set('user', new User($registry));
    не во framework, а в файле admin\controller\startup\login.php
    PHP:
    // User
            
    $this->registry->set('user', new Cart\User($this->registry));

            if (!
    $this->user->isLogged() && !in_array($route$ignore)) {
                return new 
    Action('common/login');
            }
    Насколько я понимаю, надо сначала клонировать admin\controller\startup\login.php и в нем прописать
    PHP:
    // User
            
    $this->registry->set('user', new Cart\User($this->registry));

            
    $this->user->login(__username____password__);

            if (!
    $this->user->isLogged() && !in_array($route$ignore)) {
                return new 
    Action('common/login');
            }
    Потом клонировать system\config\admin.php и в нем изменить
    PHP:
    // Actions
    $_['action_pre_action'] = array(
        
    'startup/startup',
        
    'startup/error',
        
    'startup/event',
        
    'startup/sass',
        
    'startup/login_ВАШ',
        
    'startup/permission'
    );
    Затем клонировать system\framework.php и в нем изменить
    PHP:
    $config->load($admin_ВАШ);
    Затем клонировать system\startup.php и изменить
    PHP:
    function start($admin_ВАШ) {
        require_once(
    DIR_SYSTEM 'framework_ВАШ.php');   
    }
    а затем клонировать admin/index.php в нем исправить
    PHP:
    // Startup
    require_once(DIR_SYSTEM 'startup_ВАШ.php');

    start('admin_ВАШ');
    Dotrox, поправь меня, если что не так. Ибо в первый раз залез в эти дебри.
     
    mr.zefer нравится это.
  15. ChipZip

    ChipZip

    Регистрация:
    1 фев 2018
    Сообщения:
    14
    Симпатии:
    0
    Огромное спасибо, буду пробовать.

    В этом моменте не совсем понял : Вместо login_ВАШ подставить свой логин или вместо ВАШ ставить логин ?
    --- Добавлено, 3 фев 2018 ---
    Если я правильно Вас понял и сделал, то получается что ссылка которую я даю Крону будет такой : http://сайт.ру/admin/index_клон.php?route=catalog/suppler/load&form_id=1&page=1
    без токена.
     
  16. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    Везде, где стоит постфикс "_ВАШ" имеется ввиду клон файла, т.е. вы клонировали файл admin\controller\startup\login.php и дали ему имя admin\controller\startup\login_clone.php, значит и пишите там login_clone.
    А на счет токена... По моей логике, если в этом же файле admin\controller\startup\login_clone.php добавить в массив $ignore путь к вашему модулю, то токен не понадобится.
    PHP:
    $ignore = array(
                    
    'common/login',
                    
    'common/logout',
                    
    'common/forgotten',
                    
    'common/reset',
                    
    'error/not_found',
                    
    'error/permission',
                    
    'catalog/suppler'
                
    );
    P.S. catalog/suppler - это вроде модуль Автоматическая обработка прайсов?? Разве у него нет возможности добавить команду в крон?

    P.P.S. Сам я этого всего не пробовал, поэтому не факт, что сработает. Пробуйте, о результате отпишитесь. Хоть сам на будущее буду знать )))
     
    mr.zefer нравится это.
  17. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Действительно. Но login.php всё равно трогать не надо - нам в любом случае нужен именно framework (чтоб меньше новых файлов создавать). Надо в него тогда добавить:
    PHP:
    $registry->set('user', new Cart\User($registry));
    И дальше уже
    PHP:
    $registry->get('user')->login(__username____password__);
    $registry->get('session')->data['token'] = md5(mt_rand()); 

    Я выше писал: токен нужен не для доступа, а для исключения ошибок, ибо он много где используется в коде.
     
  18. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    Я тоже думал как бы поменьше файлов клонировать. Тогда вопрос - куда вставлять во framework?
    PHP:
    $registry->set('user', new Cart\User($registry));
    Насколько я понимаю на этом участке кода
    PHP:
    // Pre Actions
    if ($config->has('action_pre_action')) {
        foreach (
    $config->get('action_pre_action') as $value) {
            
    $controller->addPreAction(new Action($value));
        }
    }
    User заново инициализируется. И если не залогинен - перенаправляется на 'common/login'.
    Получается тогда, хотя бы в конфиге system\config\admin_clone.php надо из массива $_['action_pre_action'] удалить 'startup/login'.
    Или все action_pre_action перенести во framework по порядку и вместо 'startup/login' вставить те заветные 3 строчки.
    Уж, извините, времени не было разбираться какие action_pre_action нужны, а какие вообще можно игнорировать, знаю только, что 'startup/startup' точно не стоит удалять)))

    P.S. Вообще, на досуге надо бы наверно один универсальные index_cron.php для админки написать для таких случаев, без клонирования лишних файлов, конфигов, стартапов)).

    P.P.S. Dotrox'у спасибо за постоянную недосказанность - заставляешь мозг работать, а не просто раздавать готовые решения.
     
    mr.zefer нравится это.
  19. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    Други, зачем обострять ситуацию с нагрузкой опена, достаточно в файле index_cron.php прописать константу с 32-значнным ключем и сверять по обращению с кроном:
    Код:
    define('MY_KEY', '12412413412341234124124134123412');
    if((PHP_SAPI != 'cli') && ($GET['my_syper_mega_32_key'] != MY_KEY)) die('Access denied');
    далее - стандартный код контроллера (ну или какую логику пропишет)
    касательно ссылки крона, то вот пример обращения:
    Код:
    wget -O - -q -t 1 http://ваш_сайт.ru/index_cron.php?my_syper_mega_32_key=12412413412341234124124134123412
    ИМХО
     
  20. Master2KAZ

    Master2KAZ

    Регистрация:
    25 окт 2014
    Сообщения:
    183
    Симпатии:
    72
    Ну тут человек интересуется как запустить стандартный модуль из крона. Речь не идет о переписывании контроллера.

    Началось все с того, что как написал Dotrox, достаточно было прописать 3 строки, а потом выяснилось, что с OcStore 2.3 так не прокатит, дальше начали выяснять как прокатит и понеслось)))