web-dev-qa-db-ja.com

外部(スタンドアロン)スクリプトからのJoomlaユーザーパスワードのリセット

ユーザーが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が必要ですか?

1
hngr18

Curlは、単純なキー=>値の形式の変数を期待し、次にhttpエンコードします。だからあなたは設定する必要があります:

$vars = 'jform[email]='.urlencode($emailadr).'&'.urlencode($token).'=1';

トークンフィールドのフィールド値には「なし」に注意してください

3
jdog