0

マルチサイト設定で別の drupal サイトにノードを作成するためのコードが 1 つの drupal サイトにあります。セッション ID を取得して正常にログインしているように見えますが、「ページ」ノードを作成しようとすると、「アクセスが拒否されました」というメッセージが表示されます。[サービス] -> [設定] の下に「キー認証」があり、「キーを使用する」のチェックが外され、「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 ) ) )

--

アクセス拒否

4

2 に答える 2

1

私は最近、PHP セッション ID が思ったよりも複雑であることを発見しました。

それらが機能するには、XMLRPC トランスポートが、Drupal の認証に使用される Cookie を完全にサポートする必要があります。

Cookie がなければ、各リクエストは新しい匿名リクエストとして扱われ、新しいセッション ID が与えられます。したがって、ログインしたという事実は、次に行う xmlrpc 呼び出しには何の意味もありません。

私はPythonでいくつかの作業を行っており、Cookieをサポートするカスタムトランスポートオブジェクトを作成しましたが、今ではすべてうまくいきます。ここでpythonでこれを行う方法を見つけました:

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

(edit-add) また、サービス モジュールのエラー報告がかなり悪いことも付け加えておきます。たとえば、配列を期待しているときに引数を文字列として送信すると (配列内の文字列を使用して)、パラメーター エラーがあるという事実を実際には反映していないアクセス拒否エラーが発生することがよくあります。

[管理] > [サイト構築] > [サービス] > [参照] でテストして、サービスが期待どおりに機能していることを確認し、使用するサービスをクリックします。

于 2010-07-12T03:40:13.800 に答える