drupal использует node.save с вызовом XMLRPC для другого сайта. Сообщение «Отказано в доступе» - PullRequest
0 голосов
/ 07 июня 2010

У меня есть фрагмент кода на 1 сайте drupal для создания узла другого сайта drupal в настройке нескольких сайтов. Похоже, я получаю sessionid и просто вхожу в систему, но при попытке создать узел "page" я получаю "Access denied". Под Сервисами -> Настройки у меня «Аутентификация по ключу», «Использовать ключи» снят, а «Использовать sessid» отмечен. У меня есть права доступа для вошедшего в систему пользователя: «создавать содержимое страницы», «администрировать сервисы» и т. Д. Ниже мой код:

<p>Test Page 1</p>
<? $url = 'http://drupal2.dev/xmlrpc.php'; ?>
<?
$conn = xmlrpc($url, 'system.connect');
print_r($conn);
?>
<p>--</p>
<?
$login = xmlrpc($url, 'user.login', $conn['sessid'], 'superuser_name', 'superuser_password');
print_r($login);
?>
<p>--</p>
<?
$data=array('type'=>'page', 'title'=>'Test', 'body'=>'test');
$data_s=serialize($data);
$result = xmlrpc($url, 'node.save', $login['sessid'], $data_s);
echo $result;

//echo $data_s;

?>
<?
if($error = xmlrpc_error()){
    if($error->code > 0){
        $error->message = t('Outgoing HTTP request failed because the socket could not be opened.');
    }

    drupal_set_message(t('Operation failed because the remote site gave an error: %message (@code).',
            array(
                '%message' => $error->message,
                '@code' => $error->code
            )
        )
    );

}
?>

Выход этого сценария:


Array ( [sessid] => 9eebdde9bf0bfd9610cc2f03af131a9c [user] => Array ( [uid] => 0 [hostname] => ::1 [roles] => Array ( [1] => anonymous user ) [session] => [cache] => 0 ) )

-

Array ( [sessid] => c0ca4c599e41e97e7a7ceb43ee43249e [user] => Array ( [uid] => 1 [name] => eric [pass] => 13583b155536098b98df41bb69fcc53 [mail] => email@gmail.com [mode] => 0 [sort] => 0 [threshold] => 0 [theme] => [signature] => [signature_format] => 0 [created] => 1271813934 [access] => 1275867734 [login] => 1275868794 [status] => 1 [timezone] => [language] => [picture] => [init] => email@gmail.com [data] => a:0:{} [roles] => Array ( [2] => authenticated user ) ) )

-

Доступ запрещен

Ответы [ 2 ]

1 голос
/ 12 июля 2010

Недавно я обнаружил, что идентификаторы сессии PHP более сложны, чем я думал.

Чтобы они работали, ваш транспорт XMLRPC должен полностью поддерживать файлы cookie, которые используются для аутентификации Drupal.

Без файлов cookie каждый запрос рассматривается как новый анонимный запрос и ему присваивается новый идентификатор сеанса. Так что тот факт, что вы вошли в систему, ничего не значит для следующего вызова xmlrpc, который вы делаете.

Я делаю некоторую работу в python и создал собственный транспортный объект для поддержки куки, и теперь все это работает для меня. Я узнал, как сделать это в Python здесь:

http://osdir.com/ml/python.cherrypy/2005-12/msg00142.html

(edit-add) Я мог бы также добавить, что модуль services довольно плох с отчетом об ошибках. Например, если вы отправляете аргумент в виде строки, когда он ожидает массив (со строкой в ​​массиве), вы часто можете получить ошибки отказа в доступе, которые на самом деле не отражают факт наличия ошибки параметра.

Убедитесь, что служба работает должным образом, протестировав ее в разделе «Администрирование»> «Создание сайта»> «Службы»> «Обзор» и выберите службу, которую вы хотите использовать.

0 голосов
/ 02 августа 2013

код сайта 1:

function exmple2_cron() {  
  homes_sync_get_node_list();
}

function homes_sync_get_node_list() { 

  $methods = xmlrpc('http://example.com/map/xmlrpc.php', array('system.listMethods' => array()));
  $node_ids = xmlrpc('http://example.com/map/xmlrpc.php', array('node.getAllHomes'=>array()));

   if (xmlrpc_error()) {  
    $error = xmlrpc_error();

      watchdog('homes_sync', 'Error getting node list from parent server. Error: @error.', array('@error' => $error);
  } 
  else {
    foreach ($node_ids as $nid) {
      $nodes[] = $nid;
    }
  variable_set('parent_home_nodes', $nodes);
  watchdog('homes_sync', 'Successfully retrieved node list from parent server.', array(), WATCHDOG_NOTICE);
  }

  homes_sync_perform_update();
}

function homes_sync_perform_update() {
  $node_ids = variable_get('parent_home_nodes', 0);
  foreach ($node_ids as $nid) {
    $data = xmlrpc('http://example.com/map/xmlrpc.php', array('node.get' => array($nid)));print_r($data);exit;
    $result = db_fetch_array(db_query('SELECT n.nid, n.title, n.type FROM {node} n WHERE n.title = "%s" AND n.type = "%s"', $data['title'], 'page'));
    if (xmlrpc_error()) {
      $error = xmlrpc_error();
      watchdog('homes_sync', 'Could not perform XMLRPC request. Error: @error.', array('@error' => $error), WATCHDOG_CRITICAL);
    } else {
      if (is_array($data)) {
        $node = "";
        if ($result && $result['nid']) {
          $node->nid = $result['nid'];
        }

    $node->type = $data['type'];
    $node->uid = 1;
    $node->status = $data['status'];
    $node->created = $data['created'];
    $node->changed = $data['changed'];
    $node->comment = $data['comment'];
    $node->promote = $data['promote'];
    $node->moderate = $data['moderate'];
    $node->sticky = $data['sticky'];
    $node->tnid = $data['tnid'];
    $node->translate = $data['translate'];
    $node->title = $data['title'];
    $node->body = $data['body'];
    $node->teaser = $data['teaser'];
    $node->format = $data['format'];
    $node->name = $data['name'];
    $node->data = $data['data'];
    $node->path = $data['path'];

    node_save($node);
       unset($node);
      }
    }
  }
}

код удаленного сайта:

function example_xmlrpc() {
$methods = array();
$methods[] =  array(  
    'node.getAllHomes',
    'homes_service_node_get_all_homes', 
     array('int'),
  );  
return $methods;  
}

function homes_service_node_get_all_homes() {
  $query = db_query('SELECT n.* FROM {node} n');
  foreach ($query as $record){ 
    $nid[] = $record;
  }
  return $nid;
}
...