/* Authentification FLE : WordPress délègue l'authentification à l'API Didier FLE.
* Version durcie : si une API est injoignable ou répond mal, on n'interrompt plus
* la connexion, on journalise la raison et on laisse WordPress continuer.
* Les messages "[Auth FLE]" apparaissent dans wp-content/debug.log (si WP_DEBUG_LOG est actif).
*/
function bda_fle_log( $msg ) {
error_log( '[Auth FLE] ' . $msg );
}
/* Connexion à l'API KNE (ws-pne) : récupère le jeton et l'UID, pose les cookies. */
function bda_authto_api( $username, $password ) {
$url = 'https://ws-pne.kiosque-edu.com/hews.php';
$apikey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWRpZXItZmxlIiwiaXNzIjoiQmlibGlvdGjDqHF1ZSJ9.SC7alBYIyDsBFY2A35zrEtUscwV42vNMeqdaRJtDAQM';
$sni = 'ws-pne.kiosque-edu.com';
// recette
// $url = 'https://ws-pne.rece.hachette-livre.fr/hews.php';
// $apikey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWRpZXItZmxlLW5wIiwiaXNzIjoiQmlibGlvdGjDqHF1ZSJ9.1V3KftQDJyqW0g-vHaD9AsqF6nCFrWofJqQmj4Pzn5Q';
// $sni = 'ws-pne.rece.hachette-livre.fr';
$result = wp_remote_post( $url . '/UserAuthentification', array(
'method' => 'POST',
'timeout' => 15,
'redirection' => 5,
'httpversion' => '1.0',
'blocking' => true,
'headers' => array(
'Host' => $sni,
'ApiKey' => $apikey,
),
'body' => array(
'username' => $username,
'password' => $password,
'acl_type' => 'ACL_DIDIER_FLE',
),
) );
if ( is_wp_error( $result ) ) {
bda_fle_log( 'KNE injoignable : ' . $result->get_error_message() );
return false;
}
$code = (int) wp_remote_retrieve_response_code( $result );
if ( 200 !== $code ) {
bda_fle_log( 'KNE HTTP ' . $code . ' : ' . substr( wp_remote_retrieve_body( $result ), 0, 300 ) );
return false;
}
$bearer = str_replace( 'Bearer ', '', (string) wp_remote_retrieve_header( $result, 'authorization' ) );
$body = json_decode( wp_remote_retrieve_body( $result ) );
$uid = $body->WebServiceReturn->Result[0]->UIDUser ?? '';
if ( '' === $bearer || '' === (string) $uid ) {
bda_fle_log( 'KNE : jeton ou UIDUser absent dans la réponse' );
return false;
}
$_SESSION['Authorization'] = $bearer;
$_SESSION['UIDUSER'] = $uid;
setcookie( 'UIDUSER', $uid, 0, '/' );
setcookie( 'Authorization', $bearer, 0, '/' );
return true;
}
/* Appel d'un endpoint d'authentification Didier FLE. Retourne WebServiceReturn, ou null si l'API est en panne. */
function bda_fle_call( $endpoint, $username, $password ) {
$response = wp_remote_post( 'https://www.didierfle.fr/apifle/' . $endpoint, array(
'method' => 'POST',
'timeout' => 15,
'redirection' => 5,
'httpversion' => '1.1',
'blocking' => true,
'sslverify' => false,
'body' => array(
'login' => $username,
'password' => $password,
),
) );
if ( is_wp_error( $response ) ) {
bda_fle_log( $endpoint . ' injoignable : ' . $response->get_error_message() );
return null;
}
$raw = wp_remote_retrieve_body( $response );
$data = json_decode( $raw, true );
if ( ! is_array( $data ) || ! isset( $data['WebServiceReturn'] ) || ! is_array( $data['WebServiceReturn'] ) ) {
bda_fle_log( $endpoint . ' : réponse invalide (HTTP ' . wp_remote_retrieve_response_code( $response ) . ') ' . substr( $raw, 0, 300 ) );
return null;
}
return $data['WebServiceReturn'];
}
function bda_fle_not_confirmed( $ret ) {
return isset( $ret['Result'][0] ) && 'Not confirmed' === $ret['Result'][0];
}
add_filter( 'authenticate', 'fle_auth', 10, 3 );
function fle_auth( $user, $username, $password ) {
if ( '' === (string) $username || '' === (string) $password ) {
return $user;
}
// 1. Essai en tant qu'élève
$ret = bda_fle_call( 'UserAuthenticationDidierFLEEleve', $username, $password );
if ( null === $ret ) {
return $user; // API en panne : on laisse WordPress tenter l'authentification locale
}
// 2. Échec élève (et pas "compte inactif") : essai en tant qu'enseignant
if ( ! empty( $ret['Error'] ) && ! bda_fle_not_confirmed( $ret ) ) {
$ret = bda_fle_call( 'UserAuthenticationDidierFLEEnseignant', $username, $password );
if ( null === $ret ) {
return $user;
}
}
// 3. Erreurs renvoyées par l'API
if ( ! empty( $ret['Error'] ) ) {
if ( bda_fle_not_confirmed( $ret ) ) {
return new WP_Error( 'inactive', __( 'ERROR: This user is inactive' ) );
}
$message = $ret['Result'][0]['Message'] ?? 'Identifiants incorrects';
return new WP_Error( 'denied', __( 'ERROR: ' ) . $message );
}
// 4. Succès : on vérifie que la réponse contient bien les données utilisateur
$data = $ret['Result'][0]['DatasUser'] ?? null;
if ( ! is_array( $data ) || empty( $data['email'] ) ) {
bda_fle_log( 'Succès sans DatasUser/email exploitable pour ' . $username );
return $user;
}
$email = $data['email'];
$first_name = $data['prenom'] ?? '';
$last_name = $data['nom'] ?? '';
$id_user_fle = $data['acl_user_id'] ?? '';
$userkey = $data['GUIDUtilisateur'] ?? '';
if ( isset( $data['est_professionnel_education'] ) ) {
$role = 'enseignant';
} elseif ( isset( $data['RoleUtilisateur'] ) ) {
$role = 'eleve';
} else {
$role = 'subscriber';
}
// Connexion KNE (ressources) : un échec ne bloque plus la connexion WordPress
bda_authto_api( $username, $password );
// Utilisateur déjà présent dans WordPress
$existing = get_user_by( 'email', $email );
if ( $existing ) {
return $existing;
}
// Sinon on le crée
$new_user_id = wp_insert_user( array(
'user_email' => $email,
'user_login' => $email,
'first_name' => $first_name,
'last_name' => $last_name,
'display_name' => trim( $first_name . ' ' . $last_name ),
'role' => $role,
'user_pass' => $password, // l'ancien code utilisait la clé 'password', ignorée par WordPress
) );
if ( is_wp_error( $new_user_id ) ) {
bda_fle_log( 'Création utilisateur impossible pour ' . $email . ' : ' . $new_user_id->get_error_message() );
return $new_user_id;
}
update_user_meta( $new_user_id, '_userkey', 'field_5c92204eed02f' );
update_user_meta( $new_user_id, 'userkey', $userkey );
update_user_meta( $new_user_id, '_id_user', 'field_5c9220d49066d' );
update_user_meta( $new_user_id, 'id_user', $id_user_fle );
return new WP_User( $new_user_id );
}
L’article Le DELF Prim A1.1 100% réussite – Livre + didierfle.app est apparu en premier sur Didier FLE.
]]>L’article Le DELF Junior et Scolaire B2 100% Réussite – édition 2022-2023 – Livre numérique est apparu en premier sur Didier FLE.
]]>L’article Le DELF Junior et Scolaire B1 100% Réussite – édition 2022-2023 – Livre numérique est apparu en premier sur Didier FLE.
]]>L’article Le DELF Prim A2 100% réussite – Livre + didierfle.app est apparu en premier sur Didier FLE.
]]>L’article Le DELF Junior et Scolaire A2 100% Réussite – édition 2022-2023 – Livre numérique est apparu en premier sur Didier FLE.
]]>L’article Réussir le DILF A1.1 – édition 2008 – Livre + audios téléchargeables est apparu en premier sur Didier FLE.
]]>L’article Réussir le TCF pour l’acces à la nationalité française (ANF) – édition 2013 – Livre + didierfle.app est apparu en premier sur Didier FLE.
]]>L’article Le DELF B2 100% Réussite – édition 2016-2017 – Livre + CD mp3 est apparu en premier sur Didier FLE.
]]>L’article Le DELF Prim A1 100% réussite – Livre + didierfle.app est apparu en premier sur Didier FLE.
]]>L’article Le DELF Scolaire et Junior A2 100% Réussite – édition 2017-2018 – Livre + CD mp3 est apparu en premier sur Didier FLE.
]]>L’article Réussir le DELF B2 – édition 2010 – Livre + CD est apparu en premier sur Didier FLE.
]]>L’article Réussir le DELF A1 – édition 2010 – Livre + CD est apparu en premier sur Didier FLE.
]]>L’article Le DELF Scolaire et Junior B1 100% Réussite – édition 2017-2018 – Livre + CD mp3 est apparu en premier sur Didier FLE.
]]>L’article Le DELF Scolaire et Junior B2 100% Réussite – édition 2017-2018 – Livre + CD mp3 est apparu en premier sur Didier FLE.
]]>L’article Le DELF B1 100% Réussite – édition 2016-2017 – Livre + didierfle.app est apparu en premier sur Didier FLE.
]]>