Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Доступ в админ с помощью curl


Recommended Posts

День добрый, подскажитеплиз решение.

По api генерируется токен, и потом с помощью curl нужно запустить метод в админке с передачей post данных.

 

$curl = curl_init( 'https://site.ru/admin/index.php?route=extension/analitycs/someMethod&token=' . $token);

    curl_setopt_array( $curl, array(
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_RETURNTRANSFER=> TRUE,
        CURLOPT_POSTFIELDS    => $data,
        CURLOPT_HTTPHEADER    => array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data)
        )
    ));

    curl_exec($curl);
    curl_close($curl);

запрос идет с того же ip, с  которого генерился токен.

Добраться до метода не получается ((( , несмотря наличия токена , все равно упирается в логин и пароль. 

Змінено користувачем controll
Надіслати
Поділитися на інших сайтах


4 часа назад, kJlukOo сказал:

подозреваю, что дело в

image.png.769fa3d928cf13ed36498026d04a59be.png

 

Добавил, 

$curl = curl_init( 'https://site.ru/admin/index.php?route=extension/analitycs/someMethod&token=' . $token);

    curl_setopt_array( $curl, array(
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_RETURNTRANSFER=> TRUE,
        CURLOPT_POSTFIELDS    => $data,
        CURLOPT_COOKIEFILE => '/home/site/tmp/cookie.txt', 
        CURLOPT_COOKIEJAR => '/home/site/tmp/cookie.txt',
        CURLOPT_HTTPHEADER    => array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($data)
        )
    ));

    curl_exec($curl);
    curl_close($curl);

куки в директорию пишет , но все равно, безрезультатно.

Без авторизации не хочет((.

 

Надіслати
Поділитися на інших сайтах


после получения токена curl закрывается и для запроса метода, создается новый curl_init. Может нужно както метод запрашивать после получения токена, не закрывая curl?

Надіслати
Поділитися на інших сайтах


Шлете сначала логин и пароль на страницу авторизации. После этого вытаскиваете токен и делаете запрос с куками и вашим токеном

 

 

Надіслати
Поділитися на інших сайтах


function login($url,$login,$pass){
    $ch = curl_init();
    if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,"login=".$login."&pass=".$pass);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/site/tmp/cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, '/home/site/tmp/cookie.txt');
    $result=curl_exec($ch);

    curl_close($ch);

    return $result;
}

Что-то ниичего не понимаю ((( . Вот для захода код, все равно возвращает страницу логина. Тыкните пожалуйста , что не так.

Запрос на страницу "https:/site.ru/admin/index.php"

Змінено користувачем controll
Надіслати
Поділитися на інших сайтах


может кому интересно будет, CURLOPT_POSTFFIELDS нужно параметр в виде массива, в таком случае заголовок Content-Type  будет установлен в значение multipart/form-data . Тогда авторизация проходит, иначе нет.

Надіслати
Поділитися на інших сайтах


к сожалению вопрос с вызовом нужного метода остался

после авторизации и получения токена,, все равно не получается запустить этот метод.

возвращается не ошибок , ничего.

 

буду признателен помощи. Уже сил нет, помогите плиз

 

function login($url,$login,$pass){
    $value = [
        'username' => $login,
        'password' => $pass
    ];

    $ch = curl_init();
    if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $value);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, '/home/site/tmp/cookie.txt');
    $result=substr(strrchr(curl_exec($ch), '='), 1 );
    curl_close($ch);

    return $result;
}

function read($url){
    $ch = curl_init();
    if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    }
    curl_setopt($ch, CURLOPT_URL, $url);
    // откуда пришли на эту страницу
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //запрещаем делать запрос с помощью POST и соответственно разрешаем с помощью GET (для простоты, хотя в дальнейшем нужно будет post)
    curl_setopt($ch, CURLOPT_POST, 0);
    //отсылаем серверу COOKIE полученные от него при авторизации
    curl_setopt($ch, CURLOPT_COOKIEFILE, '/home/site/tmp/cookie.txt');
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");

    $result = curl_exec($ch);
    curl_close($ch);
}

$token = login('https://site/admin/index.php?route=common/login', 'login', 'pass');
$url = 'https://site/admin/index.php?route=extension/analitycs/getUpdate&token='.$token;

$result= read($url);
print_r = $result

 

Змінено користувачем controll
Надіслати
Поділитися на інших сайтах


может все таки этот метод extension/analitycs/getUpdate продублировать в catalog/ и не парится с токенами и тд?

 

и что возвращает curl_errno > curl_error ??

Надіслати
Поділитися на інших сайтах

6 часов назад, OCdevWizard сказал:

может все таки этот метод extension/analitycs/getUpdate продублировать в catalog/ и не парится с токенами и тд?

 

и что возвращает curl_errno > curl_error ??

Спасиб большое ))), сработало.

curl_error вернул Illegal characters found in URL Оказалось при вытаскивания токена в конце притаился пробел, изза этого не работала ссылка. Обернул в trim еще.

 

PS. Насчет в каталог , не совсем то, так как вызванный метод это вход для работы с заказами, неудобно будет ))

Надіслати
Поділитися на інших сайтах


  • 1 year later...

Пытаюсь, по найденным в сети примерам работы апи опренкарт, добавить свой метод в апи.

Пример файла:

<?php
class ControllerApiCopyFilter extends Controller {

	public function copy() {
    
    $json = array();
    $this->log->write($this->request->post);
    
    $this->log->write($this->session->data['api_id']);
    if (!isset($this->session->data['api_id'])) {
 		   $json['error']['warning'] = $this->language->get('error_permission');
 	} else {
    	$this->log->write($this->request->post);
    	
    }

		$this->response->addHeader('Content-Type: application/json');
    $this->response->setOutput(json_encode($json));
  }
} 

Получаю токен:

stdClass Object
(
    [success] => API сессия успешно запущена!
    [token] => 0RpUQqTbHMT6pomZHLwwm*********
)

Далее обращаюсь к своему методу:

 

	
	if(isset($token)) {
		$url = DOMEN_NAME."index.php?route=api/copyfilter/copy/&token=".$token;
		
		$post = array (
		 'copy_type' 		=> 'checkbox',
		 'copy_status'  	=> '-1',
		 'copy_attribute'	=> '0',
		 'copy_filter'		=> '1',
		 'copy_option'		=> '1',
		 'copy_truncate'	=> '1',
		 'copy_category'	=> '1'
		);
	 
    $curl = curl_init( $url );
		curl_setopt_array( $curl, array(
		CURLOPT_RETURNTRANSFER	=> TRUE,
		CURLOPT_POSTFIELDS      => $post, 
    	CURLOPT_COOKIEFILE, 'cookie.txt') );
	 $result=curl_exec($curl);
     a($result);
     curl_close($curl);

Получаю:

Notice: Undefined index: api_id in /var/www/korney01/data/www/test.caseroom.in.ua/catalog/controller/api/copyfilter.php on line 9{"error":{"warning":"error_permission"}}

Что я делаю не так?

Надіслати
Поділитися на інших сайтах

1 час назад, mario512 сказал:

Что я делаю не так?

Разрешение на запись cookie.txt есть? По идее так то всё правильно делаете) Но по какой то причине у вас в сессии нету api_id. Так то по идее даже если бы не было прав на запись файла куки, то ошибку должны были получить ранее, связанную с тем что текен не совпадает с сессией, но у вас уходит на следующий этап.

Надіслати
Поділитися на інших сайтах

Мой ip в списке разрешенных. В catalog/controller/api/login.php сессию стартует данная строчка:

$this->session->start('api', $session_id_new); //$session_id_new получаю.

Пример функции, стартующей сессию, system/library/session.php

public function start($key = 'default', $value = '') {
		
		if ($value) {
			$this->session_id = $value;
		} elseif (isset($_COOKIE[$key])) {
			$this->session_id = $_COOKIE[$key];
		} else {
			$this->session_id = $this->createId();
		}	
		
		if (!isset($_SESSION[$this->session_id])) {
			$_SESSION[$this->session_id] = array();
		}
		
		$this->data = &$_SESSION[$this->session_id];
		
		if ($key != 'PHPSESSID') {
			setcookie($key, $this->session_id, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
		}
		
		return $this->session_id;
	}	

Насколько я понял, должна стартовать сессия с именем api и с соответствующий кукой. 

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.