Joomla Authentification de la Connexion à partir de app externe
J'ai besoin de vérifier qu'un Joomla nom d'utilisateur et mot de passe est valable à partir de mon application externe. Il n'est pas nécessaire que l'utilisateur est connecté au système juste que leur compte existe. Comment puis-je faire cela?
Je suis en supposant que votre application externe auront accès à la base de données de Joomla, et il est écrit en php.
J'ai déjà répondu à une question similaire à propos de création d'un utilisateur en dehors de joomla, vous pouvez utiliser la même approche, mais au lieu d'appeler la save méthode de JUser, vous pouvez utiliser bind pour vérifier si le mot de passe est correct.
Ou quelque chose mieux: il suffit de copier et coller de Joomla propre mécanisme d'authentification après la création d'un "environnement" en dehors de Joomla! Vérifier JOOMLA_PATH/plugins/authentication/joomla.php:
function onAuthenticate( $credentials, $options,&$response ){
jimport('joomla.user.helper');//Joomla does not like blank passwordsif(empty($credentials['password'])){
$response->status = JAUTHENTICATE_STATUS_FAILURE;
$response->error_message ='Empty password not allowed';returnfalse;}//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';}}
Alors vous avez un contrôleur qui ramasse ce point de vue et appelle le modèle ou l'accompagnateur de la classe qui a le code comme ci-dessous. L'avantage de ceci est que vous restez à l'intérieur de la communauté Joomla base de code et de le rendre plus sécuritaire.
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);
}
Comme une variation sur @Martin réponse, un composant peut retourner JUser objet associé à la donnée d'identification. Le composant suivant est testé dans Joomla 2.5:
Note le déconnexion avant la connexion. Après une connexion réussie, tous les appels ultérieurs avec de fausses informations d'identification serait encore de retour de l'utilisateur du premier appel, sans la déconnexion! Notez également la silencieux option. Cela rend la fonction de connexion de retour gracieusement par vrai ou faux, sans frai exceptions.
Votre app externe doit être en mesure d'accéder à la base de données de joomla application pour vérifier dans la base de données si oui ou non l'utilisateur existe/est valide. Pour le vérifier, vous devez exécuter une requête dans votre app externe pour vérifier l'existence de l'utilisateur à quelque chose comme ceci:
$query = "select user_id from your_table where user_id = id_here";
//and more code afterwords.
mais Joomla fait bizarre de hachage de mots de passe, je pourrais essayer de déconstruire la table de hachage, mais je préfère utiliser l'une de l'interne Jclass fonctions si possible. oui, vous aurez à utiliser et à comprendre comment elle met en œuvre le hachage. Oui, j'ai décidé de poursuivre dans cette voie déjà. De travail maintenant. c'est bon à écouter 🙂
Je suis en supposant que votre application externe auront accès à la base de données de Joomla, et il est écrit en php.
J'ai déjà répondu à une question similaire à propos de création d'un utilisateur en dehors de joomla, vous pouvez utiliser la même approche, mais au lieu d'appeler la
save
méthode deJUser
, vous pouvez utiliserbind
pour vérifier si le mot de passe est correct.Ou quelque chose mieux: il suffit de copier et coller de Joomla propre mécanisme d'authentification après la création d'un "environnement" en dehors de Joomla! Vérifier
JOOMLA_PATH/plugins/authentication/joomla.php
:OriginalL'auteur GmonC
Vous pourriez également écrire une API composant tel que vous utilisez une url de requête à l'API et d'obtenir une réponse JSON dos par exemple http://www.domain.com/index.php?option=com_api&view=authenicateUser&user=root&password=12345&format=raw
Alors vous avez un contrôleur qui ramasse ce point de vue et appelle le modèle ou l'accompagnateur de la classe qui a le code comme ci-dessous. L'avantage de ceci est que vous restez à l'intérieur de la communauté Joomla base de code et de le rendre plus sécuritaire.
OriginalL'auteur Martin
Comme une variation sur @Martin réponse, un composant peut retourner
JUser
objet associé à la donnée d'identification. Le composant suivant est testé dans Joomla 2.5:Vue view.raw.php:
Note le déconnexion avant la connexion. Après une connexion réussie, tous les appels ultérieurs avec de fausses informations d'identification serait encore de retour de l'utilisateur du premier appel, sans la déconnexion!
Notez également la silencieux option. Cela rend la fonction de connexion de retour gracieusement par vrai ou faux, sans frai exceptions.
Le controller.php:
Note le
raw
format. Ceci est nécessaire afin d'avoir joomla retour de la pure code json au lieu de l'ensemble de la page html.Le composant peut être appelé (via ajax) avec l'url:
index.php?option=com_extauth&task=view&format=raw&username=John&password=Doe
Le retour de l'objet JSON va contenir des valeurs NULL pour la plupart des champs dans le cas d'un échec d'ouverture de session.
La composante à part entière est le plus simple possible, en se basant sur
com_hello
sans modèle ou tmpl.OriginalL'auteur Erik Bongers
Votre app externe doit être en mesure d'accéder à la base de données de joomla application pour vérifier dans la base de données si oui ou non l'utilisateur existe/est valide. Pour le vérifier, vous devez exécuter une requête dans votre app externe pour vérifier l'existence de l'utilisateur à quelque chose comme ceci:
oui, vous aurez à utiliser et à comprendre comment elle met en œuvre le hachage.
Oui, j'ai décidé de poursuivre dans cette voie déjà. De travail maintenant.
c'est bon à écouter 🙂
OriginalL'auteur Sarfraz
Je ne sais pas comment il est sécurisé, mais je n'ai pas envie de création d'une API du composant et est venu avec cette:
Le résultat (un seul caractère) peut facilement être analysé par toute sorte de application.
OriginalL'auteur yvan vander sanden