0

私はいたるところを見てきましたが、これを理解できないようです:

C# で cPanel セッションを認証した後、URL からセキュリティ トークンをスクレイピングし、それを API 呼び出しにプラグインしようとすると、さまざまなエラーが発生します (通常、アクセスが拒否されたか無効なトークンです)。

注意すべきことの 1 つは、cPanel でセキュア ポート (この場合はポート 2083) を使用しようとしているということです。ただし、hostgator ホスティングを使用すると、自分のドメインからセキュアな hostgator サブドメインにリダイレクトされてログインします (gatorXXXX .hostgator.com:2083/)、そしてこれが何かを落としているのではないかと思っています。

最初に、別のスタックオーバーフローの投稿で見つけた次のコードを使用しようとしましたが、次のように変更しました。

cPanel のログインによって、自分のドメインからサブドメインにリダイレクトされてログインしたかどうかを確認します。リダイレクトされた場合は、そのサブドメインをスクレイピングしてプラグインし、コードを再度実行して、セッション トークンを取得します。

public static string Connect(string url, string userName, string password, string userAgent, string postData, int timeOut)
    {
        string result = "";

        // set a flag to determine if the cpanel page is different than the url
        bool moved = false;
        string newUrl = "";

        try
        {
            // Create a request for the URL.        
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            if (userAgent == null)
                userAgent = UserAgent;

            request.UserAgent = userAgent;
            request.Timeout = timeOut;

            if (userName.Length > 0)
            {
                string authInfo = userName + ":" + password;
                authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
                request.Headers["Authorization"] = "Basic " + authInfo;
                request.AllowAutoRedirect = false;
            }

            if (postData.Length > 0)
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.CookieContainer = new CookieContainer();
                // Create POST data and convert it to a byte array.
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                request.ContentLength = byteArray.Length;
                using (Stream dataStream = request.GetRequestStream())
                {
                    dataStream.Write(byteArray, 0, byteArray.Length);
                }
            }

            // Get the response.
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                // Get the stream containing content returned by the server.
                Stream dataStream = response.GetResponseStream();
                response.Cookies = new CookieCollection();
                // Open the stream using a StreamReader for easy access.
                using (StreamReader reader = new StreamReader(dataStream))
                {
                    result = string.Format("Server response:\n{0}\n{1}", response.StatusDescription, reader.ReadToEnd());
                }


                if (response.StatusDescription.ToLower().Contains("moved") && !response.Headers.ToString().Contains("/cpsess"))
                {
                    newUrl = StringUtils.ExtractNoCase(result.ToLower(), "url=", "\">", 1);
                    moved = true;
                }
                else return result;
            }
        }

        catch (Exception e)
        {
            result = string.Format("There was an error:\n{0}", e.Message);
        }

        // if the cpanel login is at a different location, Connect() with new url
        if (moved == true)
        {
            result = Connect(newUrl, userName, password, null, postData, 8000);
        }
        return result;
    }

セキュリティ トークンを取得した後、元の URL ( https://mydomain.com:2083/cpsess12334455/xml-api/.. .) と hostgator サブドメイン ( https:// gatorXXXX.hostgator.com:2083/cpsess/... .) 両方の方法で拒否されます。

それで、何日もそれと戦った後、私が見つけたcPanel認証の例のほとんどはphp/curlにあるので、このタスクを実行するためにphalangerを試すことにしました。

したがって、次のコードを使用します。

function Authentication($hostname, $username, $password)
{
    $download_url = "https://".$hostname.":2083/login/";
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl, CURLOPT_HEADER,0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl, CURLOPT_URL, $download_url);
    curl_setopt($curl, CURLOPT_POSTFIELDS, "user=".$username."&pass=".$password);
    $result = curl_exec($curl);
    curl_close($curl);
    $parts = explode( 'URL=', $result);
    $session_parts = explode( '/frontend/', $parts[1]);
    $token = $session_parts[0];

    $subdomain = "https://".$hostname.":2083" . $token . "/json-api/cpanel";

 }

そして、次のようなものを投稿してみてください (これは、ドメインに新しいサブドメインを追加することになっています):

$curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl, CURLOPT_HEADER,0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl, CURLOPT_URL, $subdomain);
    curl_setopt($curl, CURLOPT_POSTFIELDS, "user=username&cpanel_jsonapi_module=SubDomain&cpanel_jsonapi_func=addsubdomain&cpanel_jsonapi_version=2&domain=testingthis2&rootdomain=myrootdomain.com");

    $result = curl_exec($curl);
    curl_close($curl);

セキュリティ トークンを取得している間は、セキュリティ トークンをコピーしてブラウザから API 呼び出しを実行しても、常に次の結果が得られます。

{"cpanelresult":{"apiversion":"2","error":"Token denied","data":{"reason":"Token denied","re​​sult":"0"},"type": "文章"}}

だから私は困惑しています。私は C# ほど PHP に精通していないので、これをすべて C# で行い、ファランジャーを台無しにしないことを好みますが、現時点では、どちらかが機能する場合はどちらのアプローチも採用します。

私がやりたいことは、セキュリティ トークンを取得して、選択した API 呼び出しにプラグインし、cPanel にセキュリティ トークンを受け入れて API 呼び出しを処理させることだけです。

4

1 に答える 1

0

私はC#とあなたの正確なケースを知らないので、これは答えというより提案かもしれません。

私の経験から、セッショントークンを使用するだけでは不十分であることがわかりました。ログインしたのと同じセッションでも使用する必要があります(Cookieに保存されていると思います)。そのため、たとえば、あるブラウザでログインし、セッション トークンを使用して別の種類のブラウザで API 呼び出しを行おうとすると、うまくいきません。ログインしたのと同じブラウザーで API 呼び出しを試行した場合にのみ機能します。

そのため、C# では、ログインにある種のクローラー/http クライアントを使用し、API 呼び出しにも同じものを使用する必要があります。

それが役立つことを願っています。

于 2013-11-27T14:23:50.607 に答える