0

私は2日からこの問題に腹を立てています。

MODx Revolution 2.2.5 (トラディショナル)を使用しており、外部サーバーから modx にログインして、ユーザーの詳細を取得したいと考えています。

1)runprocessorメソッドは、マネージャーにログインしている場合にのみ機能することを知っています(残念ながら、それがユーザーをログインさせる唯一の方法です)ので、IFRAMEメソッドを回避して(クロススクリプティング)試してみましたが、完全に機能しましたが、できません同じ問題、クロスドメイン アクセス ポリシーのため、javascript を使用して IFRAME からデータを読み取ります。

CURL、Ajaxなどの他の方法を使用してデータを投稿しようとすると、

header("Access-Control-Allow-Origin: *"); 

ログインできます ($response->response['success'] == 1 と表示されます) が、どのデータにもアクセスできず、次のように表示されます

Fatal error: Call to a member function get() on a non-object

以下は私が使用しているスニペットコードです

if(isset($_POST) && count($_POST)){
    $c = array(
        'username' => $_POST['username'],
        'password' => $_POST['password']
    );
    $response = $modx->runProcessor('security/login',$c);
    if($response->response['success'] == 1){
        $user['id'] = $modx->user->get('id');
                $profile = $modx->user->getOne('Profile');
        $user['fullname'] = $profile->get('fullname');
        $user['email'] = $profile->get('email');
        echo json_encode($user);
    }else{
        echo json_encode($response->response); 
    }
}

2) ログイン スニペットを使用できますが、期待どおりの出力が返されません。サイトの準備ができており、すでにログイン プラグインを使用しているため、期待されるデータで応答するようにログイン プラグインを変更することさえできません。

APIまたはその他の方法を使用してmodxにログインするにはどうすればよいですか??

4

2 に答える 2

2

私の意見では、あなたは本当にこの問題を完全に間違って攻撃しています。別のサーバー/Webページにアクセスしたい場合は、iFrameを使用せず、そのままの方法で行います. これはハッキングであり、この穴は将来のバージョンで修正される可能性が高いです。

あなたがすべきことは、データベースに接続して、ユーザーテーブルから情報を収集することです。

ハッキングも「トリック」もありません。動作が停止することはなく、より安全です。

于 2012-12-23T20:55:10.587 に答える
0

さて、今日これを整理しました。以下は、完全に機能した完全なものです。注意を払う

header("Access-Control-Allow-Origin: http://www.xyz.com");

上記の CORS 仕様を使用すると、2 つのサーバーが通信できるようになります。

header("Access-Control-Allow-Origin: http://www.xyz.com");
if(isset($_POST['username']) && isset($_POST['password'])){

// get username and password from POST array
$username = $modx->sanitizeString($_POST['username']);
$password = $modx->sanitizeString($_POST['password']);
if(trim($username) != "" and trim($password) != ""){
    // Load lexicons to show proper error messages
    if (!isset($modx->lexicon) || !is_object($modx->lexicon)) {
        $modx->getService('lexicon','modLexicon');
    }
    $modx->lexicon->load('login');

    $loginContext= isset ($scriptProperties['login_context']) ? $scriptProperties['login_context'] :
    $modx->context->get('key');

    $addContexts= isset ($scriptProperties['add_contexts']) && !empty($scriptProperties['add_contexts']) ? explode(',', $scriptProperties['add_contexts']) : array();

    $mgrEvents = ($loginContext == 'mgr');

    $givenPassword = $password;

    /** @var $user modUser */
    $user= $modx->getObjectGraph('modUser', '{"Profile":{},"UserSettings":{}}', array ('modUser.username' => $username));

    if (!$user) {
        $ru = $modx->invokeEvent("OnUserNotFound", array(
            'user' => &$user,
            'username' => $username,
            'password' => $password,
            'attributes' => array(
                'loginContext' => $loginContext,
            )
        ));

        if (!empty($ru)) {
            foreach ($ru as $obj) {
                if (is_object($obj) && $obj instanceof modUser) {
                    $user = $obj;
                    break;
                }
            }
        }

        if (!is_object($user) || !($user instanceof modUser)) {
            //echo "cant locate account";
            echo $modx->toJSON($modx->error->failure($modx->lexicon('login_cannot_locate_account')));
            exit;
        }
    }

    if (!$user->get('active')) {
        //echo "inactivated accout";
        echo $modx->toJSON($modx->error->failure($modx->lexicon('login_user_inactive')));
            exit;
        }

    if (!$user->passwordMatches($givenPassword)) {
        if (!array_key_exists('login_failed', $_SESSION)) {
            $_SESSION['login_failed'] = 0;
        }
        if ($_SESSION['login_failed'] == 0) {
            $flc = ((integer) $user->Profile->get('failedlogincount')) + 1;
            $user->Profile->set('failedlogincount', $flc);
            $user->Profile->save();
            $_SESSION['login_failed']++;
        } else {
            $_SESSION['login_failed'] = 0;
        }
        //echo "wrong username pass";
        echo $modx->toJSON($modx->error->failure($modx->lexicon('login_username_password_incorrect')));
            exit;
        }

        $fullname =  $user->Profile->get('fullname');
        echo '{"success":true,"message":"Welcome '.$fullname.'!"}';
 }else{
        echo '{"success":false,"message":"Please enter username and password"}';
 }

}

于 2012-12-23T19:16:52.327 に答える