他の場所でJoomlaサイトに認証され、 Brent Friar's ニースプログラムに従っていたユーザーにログインしようとしていますが、2つの変更を適用する必要がありました。
そのサイトに特定のカスタマイズがあるかどうか、特定のログインモジュールを使用しているかどうか、または別のバージョンかどうかはわかりません。サイトへの管理者アクセス権がないため、確認できません。今、私のスクリプトは実行されていますが、ユーザーに正常にログインしていません-期待どおりのCookieを受け取りません。
代わりに、サイトに戻ります
HTTP/1.1 100続行
HTTP/1.1 303他の日付を参照:2014年7月23日水曜日18:18:25 GMTサーバー:Apache/2.2.22 X-Powered-By:PHP/5.2.17場所: http://www.strassenbau .forum-kundenportal.de/login-erfolgreich Content-Length:0 Connection:close Content-Type:text/html; charset = utf-8
私はJoomlaを少し知っていますが、それとのhttp通信の深さについては何も知りません。そのため、ここで何が問題なのかわかりません。
これが私のコードです:
<?php
$uname = "*** secret";
$upswd = "*** credentials";
$url = "http://www.strassenbau.forum-kundenportal.de/login-anmeldung";
set_time_limit(0);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE );
curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('./cookie.txt'));
curl_setopt($ch, CURLOPT_COOKIEFILE, realpath('./cookie.txt'));
curl_setopt($ch, CURLOPT_HEADER, TRUE );
$ret = curl_exec($ch);
if (!preg_match('/name="([a-zA-z0-9]{32})"/', $ret, $spoof)) {
preg_match("/name='([a-zA-z0-9]{32})'/", $ret, $spoof);
}
preg_match('/name="return" value="(.*)"/', $ret, $return); // search for hidden field "return" and get its value
// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['password'] = urlencode($upswd);
$postfields['option'] = 'com_users';
$postfields['task'] = 'user.login';
$postfields['return'] = $return[1];
$postfields[$spoof[1]] = '1';
// edit: using the location of the 303-result directly...but it does not make a difference
curl_setopt($ch, CURLOPT_URL , "http://www.strassenbau.forum-kundenportal.de/login-erfolgreich");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch);
echo "ret2: <pre>"; var_dump($ret); echo "</pre>"; // no cooking being set here!
// Get logged in cookie and pass it to the browser
preg_match('/^Set-Cookie: (.*?);/m', $ret, $m);
$cookie=explode('=',$m[1]);
setcookie($cookie[0], $cookie[1]);
?>
答えを探していたところ、Joomlaは現在セッショントークンも使用しているため、その理由で機能しないというコメントを見つけました。誰かがその説明を確認できますか?しかし、そのような状況でリモートログインはどのように処理されますか?独自のログインモジュールを実装することで問題を克服できますか?
私はようやくAutoLogin-Extensionを使用して問題を解決しました(JEDへのハイパーリンクは削除されました)。
pdate:昔は問題なく動作しましたが(Joomla 2)、拡張機能は廃止されたようです。そのため、この解決策が役に立たない場合はごめんなさい。
認証の問題を解決するには、IP LoginをインストールしてIPを有効にします。 http://extensions.joomla.org/search ?q = ip +
PD:preg_match( "/ name = ...が「return」トークンだけでなく、他の要素を見つけている可能性があります。
追加しようとしましたか
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);