Я довольно новичок в Joomla и Php в целом. Мне нужно понять, как Joomla выполняет операцию входа в систему. Ниже приведен фрагмент кода PHP, который выполняет операцию:Понимание логики логики Joomla
<form action="<?php echo JRoute::_('index.php?option=com_users&task=user.login'); ?>" method="post">
<fieldset>
<?php foreach ($this->form->getFieldset('credentials') as $field): ?>
<?php if (!$field->hidden): ?>
<div class="login-fields"><?php echo $field->label; ?>
<?php echo $field->input; ?></div>
<?php endif; ?>
<?php endforeach; ?>
<?php if (JPluginHelper::isEnabled('system', 'remember')) : ?>
<div class="login-fields">
<label id="remember-lbl" for="remember"><?php echo JText::_('JGLOBAL_REMEMBER_ME') ?></label>
<input id="remember" type="checkbox" name="remember" class="inputbox" value="yes" alt="<?php echo JText::_('JGLOBAL_REMEMBER_ME') ?>" />
</div>
<?php endif; ?>
<button type="submit" class="button"><?php echo JText::_('JLOGIN'); ?></button>
<input type="hidden" name="return" value="<?php echo base64_encode($this->params->get('login_redirect_url', $this->form->getValue('return'))); ?>" />
<?php echo JHtml::_('form.token'); ?>
</fieldset>
</form>
В моем понимании, первая линия выполнить запрос POST, чтобы отправить имя пользователя и пароль для сервера. Кроме того, маркер сеанса должен быть извлечен после успешной проверки. Часть task=user.login
означает, что она переводит вас в файл контроллера «пользователь» на функцию «login». \ components \ com_users \ controllers \ user.php и найти функцию login.I также понимаю, что у Joomla есть свой собственный метод проверки токена формы. Вы можете JSession::checkToken('post') or jexit(JText::_('JInvalid_Token'))
.
Однако мое понимание процесса входа в систему состоит в том, что эта функция login
должна отправить запрос POST на сервер с именем пользователя и паролем (учетные данные), а затем сервер будет проверять и отправлять сеансToken.
Проблема в том, что я не мог понять в нижней функции, где учетные данные отправляются через запрос POST? и где получено sessionToken? Я предположил, что должен быть URL-адрес для отправки POST, где это?
public function login()
{
JSession::checkToken('post') or jexit(JText::_('JInvalid_Token'));
$app = JFactory::getApplication();
// Populate the data array:
$data = array();
$data['return'] = base64_decode(JRequest::getVar('return', '', 'POST', 'BASE64'));
$data['username'] = JRequest::getVar('username', '', 'method', 'username');
$data['password'] = JRequest::getString('password', '', 'post', JREQUEST_ALLOWRAW);
$lang = JRequest::getVar('lang','post');
// Set the return URL if empty.
if (empty($data['return'])) {
$data['return'] = 'index.php?option=com_users&view=profile';
}else {
if($lang){
$lang = mb_substr($lang, 0, 2);
$data['return'] .= '&lang='.$lang;
}
}
// Set the return URL in the user state to allow modification by plugins
$app->setUserState('users.login.form.return', $data['return']);
// Get the log in options.
$options = array();
$options['remember'] = JRequest::getBool('remember', false);
$options['return'] = $data['return'];
// Get the log in credentials.
$credentials = array();
$credentials['username'] = $data['username'];
$credentials['password'] = $data['password'];
// Perform the log in.
if (true === $app->login($credentials, $options)) {
// Success
$app->setUserState('users.login.form.data', array());
$app->redirect(JRoute::_($app->getUserState('users.login.form.return'), false));
} else {
// Login failed !
$data['remember'] = (int)$options['remember'];
$app->setUserState('users.login.form.data', $data);
$app->redirect(JRoute::_('index.php?option=com_users&view=login', false));
}
}
Наша цель - подражать запросу с использованием JavaScript, чтобы я мог выполнять вход в систему с помощью внешнего мобильного приложения. Другими словами, мне нужно написать ту же логику в JavaScript, так что я могу войти на сайт с мобильного приложения ..
Возможно, вы захотите рассмотреть вопрос об этом на странице [Joomla Stack Exchange] (http://joomla.stackexchange.com) – Lodder