2017-10-12 12 views
1

Webサイトにログインしようとしていますが、ユーザー名またはパスワードを使用しているかのように「認証に失敗しました」というエラーが表示されます。私はJavaで同じコードを開発し、それが動作するように、渡されたパラメータは、ユーザー名とパスワードを含む正しいです。フィールドを送るときに私は間違いを犯していますか?次のようにPHP:http投稿要求を送信しますが、「認証に失敗しました」

$cookies = array(); 
foreach ($http_response_header as $hdr) { 
    if (preg_match('/^Set-Cookie:\s*([^;]+)/', $hdr, $matches)) { 
     parse_str($matches[1], $tmp); 
     $cookies += $tmp; 
    } 
} 
$cookie= reset($cookies); 

$request = array(
    'http' => array(
     'method' => 'POST', 
     'timeout' => 0, 
     'header'=> "Accept-language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3\r\n" . 
      "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n" . 
      "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6\r\n" . 
      "Cookie: ASP.NET_SessionId=".$cookie."\r\n", 
     'content' => http_build_query(array(
      '__LASTFOCUS' => '', 
      '__EVENTTARGET' => '', 
      '__EVENTARGUMENT' => '', 
      '__VIEWSTATE' => $viewstate, 
      '__VIEWSTATEGENERATOR' => $viewstategenerator, 
      'ctl00$hwsid' => $hwsid, 
      'ctl00$PageSessionId' => $pagesessionid, 
      'ctl00$DefaultUrl' => $defaulturl, 
      'ctl00$GenericErrorUrl' => $genericerrorurl, 
      'ctl00$PopupElement' => '', 
      'ctl00$PollingTimeoutSecs' => $pollingtimeoutsecs, 
      'ctl00$bodyContent$txtUser' => $user, 
      'ctl00$bodyContent$txtPassword' => $password, 
      '__CALLBACKID' => '__Page', 
      '__CALLBACKPARAM' => '"hwsid="'.$hwsid.'"&PageSessionId="'.$pagesessionid.'"&DefaultUrl="'.$defaulturl.'"&GenericErrorUrl="'.$genericerrorurl.'"&PopupElement="'.'"&PollingTimeoutSecs="'.$pollingtimeoutsecs.'"&txtUser="'.$user.'"&txtPassword="'.$password, 
      '__EVENTVALIDATION' => $eventvalidation, 
      'ctl00$bodyContent$btnLogin' => 'Conferma' 

     )), 
    ) 
); 

$context = stream_context_create($request); 
$res= file_get_contents($url, false, $context); 
echo htmlentities($res); 

for Javaの使用作業コードは次のとおりです。

cookies = initialResponse.cookies(); 

       initialResponse = Jsoup.connect(url+"Default.aspx") 
        .data("__LASTFOCUS", "") 
        .data("__EVENTTARGET", "") 
        .data("__EVENTARGUMENT", "") 
        .data("__VIEWSTATE", executionVal) 
        .data("__VIEWSTATEGENERATOR", vv1) 
        .data("ctl00$hwsid", a11) 
        .data("ctl00$PageSessionId", a22) 
        .data("ctl00$DefaultUrl", a33) 
        .data("ctl00$GenericErrorUrl", a44) 
        .data("ctl00$PopupElement", "") 
        .data("ctl00$PollingTimeoutSecs", a66) 
        .data("ctl00$bodyContent$txtUser", user) 
        .data("ctl00$bodyContent$txtPassword", pass) 
        .data("__CALLBACKID", "__Page") 
        .data("__CALLBACKPARAM", "hwsid="+a11+"&PageSessionId="+a22+"&DefaultUrl="+a33+"&GenericErrorUrl="+a44+"&PopupElement="+"&PollingTimeoutSecs="+a66+"&txtUser="+user+"&txtPassword="+pass) 
        .data("__EVENTVALIDATION", ltVal) 
        .data("ctl00$bodyContent$btnLogin", "Conferma") 
        .cookies(cookies) 
        .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36") 
        .method(Method.POST) 
        .timeout(0) 
        .execute(); 
      }catch(UnknownHostException e){ 
       JOptionPane.showMessageDialog(null, "No", "Turni", JOptionPane.ERROR_MESSAGE); 
       System.exit(0); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      cookies.putAll(initialResponse.cookies()); 

      Document doc = null; 
      try { 
       doc = Jsoup.connect(u) 
        .cookies(cookies) 
        .get(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
+0

最終的なURL、Cookie、およびPOST本文を調べると役立つ場合があります。それらを実用的なバージョンと比較してください。 – miken32

+0

私は、実際に私が最初のクッキーが生成されたウェブサイト(ASP_NET_SessionId = wpxfk3msbyghw5nlo2wlxer)にアクセスしたときに理解したと思う、そのクッキーをリクエストポストに送ったら、サイトは別のものにアクセスしてアクセスすることができます。ポスト最終要求にそう (SSOAuth = DF1D63B311125E1C34689C7D16B4BE4D798E718C1A037B189A2284797B7FFB)を追加する必要があり、クッキーは、2枚のクッキーを追加します「ASP_NET_SessionId = wpxfk3msbyghw5nlo2wlxer; SSOAuth = DF1D63B311125E1C34689C7D16B4BE4D798E718C1A037B189A2284797B7FFB」が、どのように私は、コードで取得し、第二のクッキーを追加するには? – Enzo

答えて

0

は、私はあなたがreset()を悪用している疑いがあります。最初の配列要素の値を返します。あなたが複数のクッキーを取り戻しているなら、あなたは問題があるかもしれません。特定のCookieを探している場合は、次のようなことを行うことができます。

// here's what we're looking for 
$target = "ASP.NET_SessionId"; 

// filter the array 
$cookies = array_filter(
    $http_response_header, 
    function($v) use ($target) {return strpos($v, "Set-Cookie: $target=") === 0;} 
); 

if (!empty($cookies)) { 
    // here we know we only have a single entry in the array 
    $cookie = reset($cookies); 
    $cookie = preg_replace("/.*=([^;]*)/", "$1", $cookie); 
} else { 
    // no cookies received! 
    $cookie = ""; 
} 

これは実際には必要以上に複雑です。最も簡単なことは、すべてのクッキーを取り出して2回目のリクエストで返信することです。

$cookies = array_filter(
    $http_response_header, 
    function($v) {return strpos($v, "Set-Cookie:") === 0;} 
); 
$headers = [ 
    "Accept-language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3", 
    "Content-Type: application/x-www-form-urlencoded; charset=utf-8", 
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6", 
]; 
foreach ($cookies as $cookie) { 
    $headers[] = preg_replace("/^Set-/", "", $cookie); 
} 

$request = [ 
    "http" => [ 
     "method" => "POST", 
     "timeout" => 0, 
     "header"=> $headers, 
     "content" => "..." 
]; 
+0

簡単には、あなたのためにクッキーを自動的に処理するカール関数を使用する方が簡単です。 – miken32

+0

Webサイトにアクセスする前に既に書いてあるように、最初のクッキーが生成されます(ASP_NET_SessionId = wpxfk3msbyghw5nlo2wlxer)。そのクッキーと一緒にリクエスト投稿を送信すると、別のサイトにアクセスしてアクセスできます。 「ASP_NET_SessionId = wpxfk3msbyghw5nlo2wlxer; SSOAuth = DF1D63B311125E1C34689C7D16B4BE4D798E718C1A037B189A22 84797B7FFB」、クッキーは、2枚のクッキーを追加するポスト最終要求になる(SSOAuth = DF1D63B311125E1C34689C7D16B4BE4D798E718C1A037B189A2 284797B7FFB)を追加しますが、どのように私は、コードで取得し、第二のクッキーを追加するには? – Enzo

+0

上記の2番目のコードブロックは、応答からのすべてのクッキーを受け取り、要求に入れます。 – miken32

関連する問題