2017-07-26 12 views
0

ウェブサイト(リモート)にログインしようとしていますが、example.com/loginと言うと、リクエストトークンを使用してリクエストトークンを取得していますだから、トークンをリフレッシュしないでログインする方法

// code for getting token cookies etc 

    $url = 'http://example.com/login/'; 

    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 

    $doc = curl_exec($ch); 
    curl_close($ch); 

// extract __RequestVerificationToken input field 
    preg_match('#<input name="__RequestVerificationToken" type="hidden" value="(.*?)"#is', $doc, $match); 


    $token = $match[1]; 

// code for redirect to dashboard 

$postinfo = "Email=".$username."&Password=".$password."&__RequestVerificationToken=".$token; 
// var_dump($token); //debug info 
$useragent="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; 



curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 

$html = curl_exec($ch); 
echo $html; 

if (curl_errno($ch)) print curl_error($ch); 
    curl_close($ch); 

、イムがトークンを取得しますが、次のカール要求でログインしようとしたとき、明らかに$トークンは私がexample.comのURLにログインできる方法を知りたいので、リフレッシュに起因する変化し続ける以下、このようなURL /同じcurlスクリプトでログインするので、$ tokenは同じに保たれますか?

TIA!

+1

あなたはページがの一部であるトークンを取得するには、Getログインフォームをクリックすると、ログインフォームがページにPOSTされ、セッションCookieが取得されます。これらのクッキーは、セッションがタイムアウトするまで機能するはずです。 ChromeでF12キーを使用し、ブラウザ間でネットワークデータを保持してブラウザがどのように動作するかを確認するには、このチェックボックスをオンにします。 –

答えて

1

最初にオフにすると、適切なDOMパーサーはトークンを抽出する正規表現よりはるかに信頼性が高いので、それを使用してください。

$token = (new DOMXPath(@DOMDocument::loadHTML($dom)))->query("//input[@name='__RequestVerificationToken']")->item(0)->getAttribute("value"); 

今や、新しいCookieセッションごとにDEFINITELYトークンが変更されます。失敗したログイン試行ごとにPOSSIBLYが変更され、まだログインしていないページ更新ごとにPOSSIBLYが変更されます。

今すぐトークンを取得すると、CookieセッションIDも割り当てられます。 「正しいトークンでログインする」には、同じセッションCookie IDをログイン要求とともに送信する必要があります。これを行う最も簡単な方法は、curlが自動的にCURLOPT_COOKIEFILE(ps、あなたはクッキーのための専用ファイルを必要とせず、emptystringを設定し、あなたにはクッキーが世話をします)でクッキーを自動的に処理させることです。有効にすると、curlは自動的に次のログイン要求でセッションCookieを送信します。

とprotip:あなたはカールコードをデバッグしているときはいつでも、CURLOPT_VERBOSEを有効にする、それは(あなたがそれを受信したすべてのクッキーを示すように)有用な情報の多くを与え

+0

domパーサーが私のために働いていなかったのはなぜか分かりませんが、CURLOPT_VERBOSEに役立つ素晴らしい情報がありました。ちょうど私がアップデートできるようになりました。リモートサイトにリダイレクトする必要がありますログイン後にそのリモートサイトは、カールの権利によって行われますか? ありがとうございます! –

+0

HTTPヘッダー 'Location:'リダイレクトの場合は 'CURLOPT_FOLLOWLOCATION'を使用するだけで、curlは自動的にリダイレクトに従います。 html/javascriptのリダイレクトの場合は、手動でcurlを使用してリダイレクトを行う必要があります。 – hanshenrik

+0

@AnasAhmedKhanNiaziとおそらく、私は 'loadHTML($ dom)'を書いたのでdomパーザは機能しませんでした。これはタイプミスです。私は 'loadHTML($ doc)'を書いています。どちらか、またはphp-xml拡張機能がインストールされていない – hanshenrik

関連する問題