Il est possible à partir d'une webapplication d'ouvrir directement Redmine en ayant auparavant authentifié l'utilisateur.
Pour ce faire il faut activer l'autologin sur redmine en suivant les étapes :
- activer les connexions automatiques dans configuration/authentification "durée maximale de connexion automatique" => 7 jours
- dans le fichier config/configuration.yml activer l'autologin :
autologin_cookie_name: autologin
autologin_cookie_path: /
autologin_cookie_secure: false
- ensuite pour faire un test il convient d'insérer un tokens de la façon suivante :
insert into tokens (user_id, action, value, created_on) values (57,'autologin','4277e87755e03ca3ad3b343ede51971dec52852b',now());
ou 57 sera l'i de la table user
Dans le script php plus bas le token sera créé automatiquement après avoir vérifier l'utilisateur ce qui sera plus pratique en cas de changement de configuration
- puis il vous faudra setter le cookie pour connecter automatiquement l'utilisateur le cookie devra évidement avoir la valeur du token dans la table
en php
setcookie('autologin', '4277e87755e03ca3ad3b343ede51971dec52852b', time()+60*60*4, '/', '.yourdomain.be');
Le problème c'est que votre application devra être un sous domaine de votre redmine sinon le cookie sera invalide ...
Heureusement vous pouvez contourner cette action en créant une page php d'autologin (autologin.php) directement sur le répertoire redmine. Redmine étant en ruby le php sera simplment exécuter par apache sans déranger redmine.
Mais attention pour que cette page soit sécurisée il faut prendre quelques précautions.
Cette page php doit dans l'idéal :
- recevoir en variable REQUEST le login de l'utilisateur et un verrou codé avec un mot de passe que les deux serveurs connaissent (= >qui permette à coup sûr de s'assurer de la bonne personne). Par exemple nous vous proposons de coder le login de l'utilisateur avec un password par type :
$cle=hash_hmac('ripemd160', 'login_user', 'mot_de_passe_secret');
Puis le php autologin.php à poser dans redmine/public
<?php
$token=substr(hash_hmac('ripemd160', $_REQUEST[''login_user'], 'mot_de_passe_secret'),0,20);
// si mauvais verrou alors on vire l'uti
if ($_REQUEST['verrou']!=$token) return ;
$link = mysql_connect('localhost', 'redmine', 'redmine');
if (!$link) {
die('Connexion impossible : ' . mysql_error());
}
$db_selected = mysql_select_db('redmine_bd', $link);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}
//on cherche l'id_user
$query="select * from users where login='".$_REQUEST['user_login']."'";
$result = mysql_query($query);
exec requete ";
while ($row = mysql_fetch_assoc($result)) {
//echo $row['id'];
$id=$row['id'];
//echo $row['login'];
}
if ($id>2) {
//on delete le token actuel si il en existe un
$rq="delete from tokens where user_id='".$id."'";
$result = mysql_query($rq);
//on re cré un token ici on pourrait mettre n'importe quel token et le créé à la volé
$rq="INSERT INTO `tokens` (`id`, `user_id`, `action`, `value`, `created_on`) VALUES (NULL, '$id', 'autologin', '$token', now());";
$result = mysql_query($rq);
setcookie('autologin', $token, time()+60*60*4, '/', 'mredmine.monnomdedomaine.fr');
}
header('Location: /');
?>
Explication : ce script posé sur le serveur Redmine va créer le cookie d'autologin avec la bonne valeur du token utilisé par redmine. Plutôt que de chercher la valeur du token redmine on le fixe déjà en supprimant l'ancien dans la table token et en le récréant "delete ... puis insert". C'est un tantinet violent mais ca marche !
évidement avant on s'assure que l'utilisateur ai le droit de faire cela pour ceci on utilise une astuce qui est le chiffrement du login avec une clé privée 'mot_de_passe_secret' que les deux serveur doivent connaître.