Как войти в joomla через внешний скрипт?

У нас есть отдельный скрипт на нашем сайте, который находится рядом с установкой Joomla 1.5. Мы используем аутентификацию Joomla для ограничения доступа к нашему скрипту. На этом этапе мы перенаправляем всех неавторизованных пользователей на сайт Joomla для входа в систему. Однако мы хотим добавить функцию входа в наш скрипт. Кто-нибудь знает, как войти в joomla из внешнего скрипта, используя имя пользователя / пароль? Благодаря!

<?php //http://domain.com/script/script.php?username=username&passwd=password define( '_JEXEC', 1 ); define('JPATH_BASE', '../' ); define( 'DS', DIRECTORY_SEPARATOR ); require_once('../configuration.php'); require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' ); require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' ); require_once ( JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php' ); /* Create the Application */ $mainframe =& JFactory::getApplication('site'); jimport('joomla.plugin.helper'); $credentials = array(); $credentials['username'] = JRequest::getVar('username', '', 'method', 'username'); $credentials['password'] = JRequest::getVar('passwd', '', 'method', 'passwd'); //perform the login action $error = $mainframe->login($credentials); $user = JFactory::getUser(); //now you are logged in $mainframe->logout(); //now you are logged out 

Для Joomla 3.x ниже более чисто и полезно. Ниже кодов будет проверяться жестко запрограммированное имя пользователя и пароль. Если пользователь существует, он будет перенаправлен на страницу index.php.

 <?php /** * Joomla! External authentication script * * @author vdespa * Version 1.0 * * Code adapted from /index.php * * @package Joomla.Site * * @copyright Copyright (C) 2005 - 2014 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ if (version_compare(PHP_VERSION, '5.3.1', '<')) { die('Your host needs to use PHP 5.3.1 or higher to run this version of Joomla!'); } /** * Constant that is checked in included files to prevent direct access. * define() is used in the installation folder rather than "const" to not error for PHP 5.2 and lower */ define('_JEXEC', 1); if (file_exists(__DIR__ . '/defines.php')) { include_once __DIR__ . '/defines.php'; } if (!defined('_JDEFINES')) { define('JPATH_BASE', __DIR__); require_once JPATH_BASE . '/includes/defines.php'; } require_once JPATH_BASE . '/includes/framework.php'; // Instantiate the application. $app = JFactory::getApplication('site'); jimport('joomla.plugin.helper'); // JFactory require_once (JPATH_BASE .'/libraries/joomla/factory.php'); // Hardcoded for now $credentials['username'] = 'admin'; $credentials['password'] = 'admin'; // Get a database object $db = JFactory::getDbo(); $query = $db->getQuery(true) ->select('id, password') ->from('#__users') ->where('username=' . $db->quote($credentials['username'])); $db->setQuery($query); $result = $db->loadObject(); if ($result) { $match = JUserHelper::verifyPassword($credentials['password'], $result->password, $result->id); if ($match === true) { // Bring this in line with the rest of the system $user = JUser::getInstance($result->id); echo 'Joomla! Authentication was successful!' . '<br>'; echo 'Joomla! Token is:' . JHTML::_( 'form.token' ); //perform the login action $error = $app->login($credentials); $logged_user = JFactory::getUser(); var_dump($logged_user ); //redirect logged in user $app->redirect('index.php'); } else { // Invalid password // Prmitive error handling echo 'Joomla! Token is:' . JHTML::_( 'form.token' ) . '<br>'; die('Invalid password'); } } else { // Invalid user // Prmitive error handling die('Cound not find user in the database'); } 

Я бы предложил одно из следующих решений:

  • Напишите плагин для входа, специфичный для вашего скрипта.
  • Использование CURL в вашем скрипте для выполнения POST-запроса в обычной форме входа (CURL также может обрабатывать файлы cookie).
  • (Простейший) : не аутентифицируйте Joomla !, а .htaccess.

Я сделал это, и его работа прекрасна. Предполагая, что ваш пользовательский сценарий входа – login.php

 -Go to Joomla installation directory -Copy PasswordHash.php from this directory /root/libraries/phpass/ to your external script's folder -Include the PasswordHash.php in login.php -Create an instance of PasswordHash like this: 

Вот фрагмент кода php

 $phpass = new PasswordHash(10, true); $password= "unhashed user password"; $db_password = 'Your hashed password in the database'; $ok= $phpass->CheckPassword( $password, $db_password ); 

?>

И вот вы … check password вернет true, если оба пароля совпадают. NB: вам нужно написать запрос для автоматической проверки из базы данных.