Joomla Login Authentication из внешнего приложения - PullRequest
4 голосов
/ 01 февраля 2010

Мне нужно проверить, что Joomla имя пользователя и пароль действительны из моего внешнего приложения. Нет необходимости, чтобы пользователь входил в систему только потому, что его учетная запись существует. Как мне это сделать?

Ответы [ 5 ]

7 голосов
/ 03 февраля 2010

Полагаю, ваше внешнее приложение будет иметь доступ к базе данных Joomla и также написано на php.

Я уже ответил на аналогичный вопрос о создании пользователя вне joomla , вы можете использовать тот же подход, но вместо вызова метода save из JUser, вы можете использовать bind проверить правильность пароля.

Или что-то лучше : просто скопируйте и вставьте собственный механизм аутентификации Joomla после создания "среды" вне Joomla ! Чек JOOMLA_PATH/plugins/authentication/joomla.php:

 function onAuthenticate( $credentials, $options, &$response ){
  jimport('joomla.user.helper');
  // Joomla does not like blank passwords
  if (empty($credentials['password'])){
   $response->status = JAUTHENTICATE_STATUS_FAILURE;
   $response->error_message = 'Empty password not allowed';
   return false;
  }

  // Initialize variables
  $conditions = '';

  // Get a database object
  $db =& JFactory::getDBO();

  $query = 'SELECT `id`, `password`, `gid`'
   . ' FROM `#__users`'
   . ' WHERE username=' . $db->Quote( $credentials['username'] )
   ;
  $db->setQuery( $query );
  $result = $db->loadObject();

  if($result){
   $parts = explode( ':', $result->password );
   $crypt = $parts[0];
   $salt = @$parts[1];
   $testcrypt = JUserHelper::getCryptedPassword($credentials['password'], $salt);

   if ($crypt == $testcrypt) {
    $user = JUser::getInstance($result->id); // Bring this in line with the rest of the system
    $response->email = $user->email;
    $response->fullname = $user->name;
    $response->status = JAUTHENTICATE_STATUS_SUCCESS;
    $response->error_message = '';
   } else {
    $response->status = JAUTHENTICATE_STATUS_FAILURE;
    $response->error_message = 'Invalid password';
   }
  }
  else{
   $response->status = JAUTHENTICATE_STATUS_FAILURE;
   $response->error_message = 'User does not exist';
  }
 }
3 голосов
/ 06 июня 2013

В качестве варианта ответа @ Martin компонент может вернуть объект JUser, связанный с данными учетными данными. Следующий компонент протестирован в Joomla 2.5:
Представление view.raw.php :

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.view' );

class ExtauthViewLogin extends JView
{
    function display( $tpl = null )
    {
        $username = JRequest::getVar( 'username', 'John Doe' );   
        $password = JRequest::getVar( 'password', 'rattlesnake' );   

        jimport('joomla.user.authentication');

        $app = JFactory::getApplication();

        $credentials = array( "username" => $username, "password" => $password);
        $options = array("silent" => true);

        $authorized = $app->logout(null, $options);
        $authorized = $app->login($credentials, $options);
        $user = JFactory::getUser();

        echo json_encode($user);
    }
}

Обратите внимание на выход до входа . После успешного входа в систему все последующие вызовы с неправильными учетными данными будут возвращать пользователя первого вызова без выхода из системы!
Также обратите внимание на параметр silent . Это заставляет функцию входа в систему корректно возвращаться с истиной или ложью, не вызывая исключений.
controller.php :

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.controller' );

class ExtauthController extends JController
{
    function display($cachable = false, $urlparams = false) 
    {
        $view = JRequest::getVar( 'view', 'login' );
        $layout = JRequest::getVar( 'layout', 'default' );
        $format = JRequest::getVar( 'format', 'raw' );   

        $view = $this->getView( $view, $format );
        $view->setLayout( $layout );    

        $view->display(); 
    }
}

Обратите внимание на формат raw. Это необходимо для того, чтобы joomla возвращала чистый код json вместо всей html-страницы.
Компонент может быть вызван (через ajax) с помощью url:
index.php?option=com_extauth&task=view&format=raw&username=John&password=Doe

Возвращаемый объект JSON будет содержать значения NULL для большинства полей в случае неудачного входа в систему.

Полный компонент - самый простой из возможных, основанный на com_hello без модели или tmpl.

3 голосов
/ 30 июня 2011

Вы также можете написать API-компонент таким образом, чтобы использовать URL для запроса API и получить ответ JSON, например, http://www.domain.com/index.php?option=com_api&view=authenicateUser&user=root&password=12345&format=raw

Затем у вас есть контроллер, который выбирает это представление и вызывает модель или вспомогательный класс с кодом, как показано ниже. Преимущество этого состоит в том, что вы держитесь в базе кода Joomla и делаете это более безопасным.

function __construct() {
  // params
  $this->username = JRequest::getVar('user', '');
  $this->password = JRequest::getVar('password', '');
  $this->checkParameters();
}

private function checkParameters() {
  // datatype checks
  if ($this->username == '') {
    die('ERROR: user is blank');
  }
  if ($this->password == '') {
    die('ERROR: password is blank');
  }
}  

function execute() {
  // Get the global JAuthentication object
  jimport( 'joomla.user.authentication');
  $auth = & JAuthentication::getInstance();
  $credentials = array( 'username' => $this->username, 'password' => $this->password );
  $options = array();
  $response = $auth->authenticate($credentials, $options);

  // success
  return ($response->status === JAUTHENTICATE_STATUS_SUCCESS) {
    $response->status = true;
  } else {
  // failed
    $response->status = false;
  }
  echo json_encode($response);
}
0 голосов
/ 15 августа 2013

Я не знаю, насколько это безопасно, но я не хотел создавать API-компонент и придумал следующее:

<?php

define("LOGIN_USER_DOES_NOT_EXIST", 0);
define("LOGIN_USER_OK_INCORRECT_PASSWORD", 1);
define("LOGIN_USER_OK_PASSWORD_OK", 2);
define("LOGIN_NO_AUTH_SERVER", 3);

$user = $_GET["id"];
$userpassword = $_GET["pw"];

$mysql = mysql_connect("localhost", "login", "password") or die(LOGIN_NO_AUTH_SERVER);
mysql_select_db("joomladb") or die(LOGIN_NO_AUTH_SERVER);
$query = "Select password FROM j25_users WHERE username='" . $user . "'";
$result = mysql_query($query) or die(LOGIN_NO_AUTH_SERVER);
if (mysql_num_rows($result) != 1) {
    $send = LOGIN_USER_DOES_NOT_EXIST;
} else {
    while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
        foreach ($line as $col_value) {
            $hashparts = explode(':', $col_value);
            $userhash = md5($userpassword.$hashparts[1]);
            if ($userhash == $hashparts[0]) $send = LOGIN_USER_OK_PASSWORD_OK;
            else $send =  LOGIN_USER_OK_INCORRECT_PASSWORD;
        }
    }
}

echo $send;

mysql_free_result($result);
mysql_close();

?>

Результат (только один символ) может быть легко проанализирован любым приложением.

0 голосов
/ 01 февраля 2010

Ваше внешнее приложение должно иметь возможность доступа к базе данных приложения joomla, чтобы проверить в базе данных, существует ли пользователь / является действительным. Чтобы проверить это, вам нужно выполнить какой-то запрос во внешнем приложении, чтобы проверить существование пользователя примерно так:

$query = "select user_id from your_table where user_id = id_here";
// and more code afterwords.
...