2010-01-15 28 views
8

Tenemos una secuencia de comandos independiente en nuestro sitio que se encuentra junto a una instalación de Joomla 1.5. Estamos utilizando la autenticación de Joomla para restringir el acceso a nuestro script. En este momento estamos redireccionando a cualquier usuario no autorizado al sitio de Joomla para iniciar sesión. Sin embargo, queremos agregar una capacidad de inicio de sesión dentro de nuestro script. ¿Alguien sabe cómo iniciar sesión en Joomla desde un script externo usando un nombre de usuario/contraseña? ¡Gracias!¿Cómo iniciar sesión en joomla a través de un script externo?

Respuesta

13
<?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 
+0

¡Perfecto! Eso es exactamente lo que estaba buscando. – user77413

+0

'$ error = $ mainframe-> login ($ credentials);' es incorrecto; debería verse como '$ result = $ mainframe-> login ($ credentials);' – simon

1

que sugeriría una de las siguientes soluciones:

  • Escribe un login plugin específica a la secuencia de comandos.
  • Usando CURL en su secuencia de comandos para hacer un post-Solicitud en el formulario de inicio de sesión normal (Curl puede hacer frente a las galletas, también.)
  • (más simple): No autenticar por Joomla !, pero con .htaccess.
6

para Joomla 3.x a continuación es más limpio y útil. Debajo de los códigos se verificará el nombre de usuario y la contraseña codificados. Si el usuario existe, será redireccionado a la página 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'); 
} 
+0

Trabajó en Joomla 3.4.1 –

+0

¿Qué sucede si el usuario ya está autenticado en esta aplicación con otro método, entonces $ credenciales no están disponibles. ¿Todavía es posible comenzar la sesión joomla? – frthjf

1

He hecho esto y está funcionando bien. Asumiendo que su script de conexión personalizada es 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: 

Aquí está el código php fragmento

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

?>

Y ahí estás --- comprobación de la contraseña devolverá verdadero si el dos contraseñas coinciden. NB: Necesita escribir una consulta para verificar automáticamente desde la base de datos.

Cuestiones relacionadas