ユーザーがJoomlaサイトにリンクするモバイルアプリケーションからパスワードをリセットする必要があります。ログイン(セッションIDの認証と返却)は成功しましたが、この外部スクリプトのパスワードをリセットすることはあまりうまくいきません。
このコードは、Joomlaで必要な必須のフォームトークンセッションIDを使用してPOSTを正常にトリガーします。
<?php
define('_JEXEC', 1);
define( 'DS', DIRECTORY_SEPARATOR );
//define('JPATH_BASE', dirname(__FILE__));
define('JPATH_BASE', '../');
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
require '../libraries/import.php';
?>
<div>
<form
id="user-registration"
action="http://siteurl/component/users/com_users/?task=reset.request"
method="post">
<input
type="text"
name="jform[email]"
value="[email protected]"
size="30">
<button
type="submit"
>Submit</button>
<input
type="hidden"
name="<?php echo JUtility::getToken(); ?>"
value="1">
</form>
</div>
これをcURL経由で処理しようとすると、(bool)falseの応答が返されます...
<?php
$token = JUtility::getToken();
$emailadr = '[email protected]';
$url = 'http://[i]siteurl[/i]/component/users/com_users/?task=reset.request';
$vars = 'jform[email]='.urlencode($emailadr).'&'.urlencode($token).'="1"';
echo $vars;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0 );
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
$response = curl_exec($ch);
var_dump($response);
これは(curlパラメーターの他の約20の組み合わせ、urlencodeの切り替え、配列/文字列の交換と共に)(bool)Falseを返します。
これに明らかな欠点はありますか?
Joomlaコントロールには特定のhttpheaderが必要ですか?
Curlは、単純なキー=>値の形式の変数を期待し、次にhttpエンコードします。だからあなたは設定する必要があります:
$vars = 'jform[email]='.urlencode($emailadr).'&'.urlencode($token).'=1';
トークンフィールドのフィールド値には「なし」に注意してください