Suite à mon petit guide (
http://sebsauvage.net/links/?-EXrUg) voici en exemple comment sécuriser le formulaire de login de DokuWiki avec TOTP.
La bonne manière de faire aurait été de créer un plugin d'authentification spécifique, mais j'ai choisi de taper directement dans le code (ce qui obligera à refaire la manip à la prochaine mise à jour, mais c'est assez rapide à faire: 6 lignes à modifier).
EDIT: J'ai mis ça sur le wiki:
http://sebsauvage.net/wiki/doku.php?id=totp#dokuwiki
Dans inc/html.php:
--------------------------------------------------------------------------------------------------------------------------------------------
--- html.php.original Mon Jul 14 13:49:34 2014
+++ html.php Mon Jul 14 19:51:35 2014
@@ -47,6 +47,7 @@
$form->addHidden('do', 'login');
$form->addElement(form_makeTextField('u', ((!$INPUT->bool('http_credentials')) ? $INPUT->str('u') : ''), $lang['user'], 'focus__this', 'block'));
$form->addElement(form_makePasswordField('p', $lang['pass'], '', 'block'));
+ $form->addElement(form_makePasswordField('otp', 'OTP', '', 'block'));
if($conf['rememberme']) {
$form->addElement(form_makeCheckboxField('r', '1', $lang['remember'], 'remember__me', 'simple'));
}
--------------------------------------------------------------------------------------------------------------------------------------------
Dans inc/auth.php
--------------------------------------------------------------------------------------------------------------------------------------------
--- auth.php.original Mon Jul 14 13:49:33 2014
+++ auth.php Mon Jul 14 20:14:55 2014
@@ -110,6 +110,7 @@
$evdata = array(
'user' => $INPUT->str('u'),
'password' => $INPUT->str('p'),
+ 'otp' => $INPUT->str('otp'),
'sticky' => $INPUT->bool('r'),
'silent' => $INPUT->bool('http_credentials')
);
@@ -179,6 +180,7 @@
return auth_login(
$evdata['user'],
$evdata['password'],
+ $evdata['otp'],
$evdata['sticky'],
$evdata['silent']
);
@@ -213,7 +215,7 @@
* @param bool $silent Don't show error on bad auth
* @return bool true on successful auth
*/
-function auth_login($user, $pass, $sticky = false, $silent = false) {
+function auth_login($user, $pass, $otp, $sticky = false, $silent = false) {
global $USERINFO;
global $conf;
global $lang;
@@ -228,7 +230,8 @@
if(!empty($user)) {
//usual login
- if($auth->checkPass($user, $pass)) {
+ require_once realpath(dirname(__FILE__).'/../../myotp/myotp.php'); // Lien vers votre librairie OTP
+ if($auth->checkPass($user, $pass) && checkOTP($otp)) {
// make logininfo globally available
$INPUT->server->set('REMOTE_USER', $user);
$secret = auth_cookiesalt(!$sticky, true); //bind non-sticky to session
--------------------------------------------------------------------------------------------------------------------------------------------
Et voilà !
PS: Je me suis aussi fait Codiad, QuiXplorer et quelques autres.