it-swarm-vi.com

Đặt lại mật khẩu người dùng Joomla từ tập lệnh bên ngoài (độc lập)

Tôi có yêu cầu người dùng đặt lại mật khẩu của họ từ một ứng dụng di động liên kết đến một trang web Joomla. Tôi đã thành công trong việc đăng nhập (xác thực và trả lại một phiên) nhưng dường như không gặp nhiều may mắn với việc đặt lại mật khẩu cho tập lệnh bên ngoài này.

Mã này kích hoạt thành công POST bằng cách sử dụng id phiên mã thông báo biểu mẫu được yêu cầu trong Joomla:

<?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>

Tôi nhận được phản hồi (bool) sai khi cố xử lý điều này qua cURL tuy nhiên ...

<?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);

Điều này (cùng với khoảng 20 kết hợp tham số curl khác, urlencode chuyển đổi, hoán đổi mảng/chuỗi) trả về (bool) Sai.

Bất kỳ lỗi rõ ràng với điều này?

Các điều khiển Joomla có yêu cầu nhất định không?

1
hngr18

Curl mong đợi các vars ở dạng khóa đơn giản => giá trị, sau đó được mã hóa http. Vì vậy, bạn cần phải thiết lập:

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

Lưu ý, không "cho giá trị trường của trường mã thông báo

3
jdog