【问题标题】:drupal using node.save with XMLRPC call to another site. "Access Denied" messagedrupal 使用 node.save 和 XMLRPC 调用另一个站点。 “拒绝访问”消息
【发布时间】:2010-06-06 23:48:10
【问题描述】:

我在 1 个 drupal 站点上有一段代码,用于在多站点设置中创建另一个 drupal 站点的节点。 看起来我得到了 sessionid 并且登录得很好,但是在尝试创建“页面”节点时,我得到“访问被拒绝”。在服务-> 设置下,我有“密钥验证”,“使用密钥”未选中,“使用 sessid”已选中。我对登录用户的agev 权限:“创建页面内容”、“管理服务”等... 以下是我的代码:

<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 ) ) )

--

访问被拒绝

【问题讨论】:

  • 您是否在接收网站上为服务模块设置了适当的权限?节点服务开启了吗?
  • 我正在运行 Services 6.x-2.2 和 XMLRPC Server 6.x-2.2
  • 对于使用xmlrpc登录的用户,他拥有所有权限。对于“服务”-> 管理服务对于“node_service”-> 加载节点数据
  • 嗯,这是 UID 1,它应该取代任何权限。奇怪。
  • 更新:我删除了序列化,只是将它作为一个数组传递并且它可以工作,但是它将节点发布为“匿名”,这是错误的,因为我使用的是在我做的时候创建的 sessid user.login 调用。

标签: drupal xml-rpc access-denied drupal-nodes drupal-services


【解决方案1】:

我最近发现 PHP 会话 ID 比我想象的要复杂。

为了使它们正常工作,您的 XMLRPC 传输需要完全支持 cookie,这些 cookie 用于 Drupal 的身份验证。

没有 cookie,每个请求都被视为一个新的匿名请求,并被赋予一个新的会话 ID。因此,您已登录的事实对您进行的下一个 xmlrpc 调用没有任何意义。

我正在用 python 做一些工作,并制作了一个自定义传输对象来支持 cookie,现在这一切都对我有用。我在这里找到了如何在 python 中执行此操作:

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

(edit-add) 我还可以补充一点,服务模块的错误报告非常糟糕。例如,如果您将参数作为字符串发送,而它需要一个数组(数组中包含字符串),您通常会收到拒绝访问错误,这并不能真正反映存在参数错误的事实。

通过在“管理”>“站点构建”>“服务”>“浏览”下进行测试来检查该服务是否按预期工作,然后单击您要使用的服务。

【讨论】:

    【解决方案2】:

    站点 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多