Page 1 sur 1

SSO entre 2 CMS connus

Posté : 17 juin 2016, 14:39
par Jan74
Salut les PHP lovers,

je bloque depuis des jours sur une chose qui doit paraître assez simple pour certains d'entre vous.

J'ai deux CMS distincts qui sont d'un côté Invision power board et de l'autre côté prestashop.

Je souhaiterai mettre prestashop en esclave de IPB. Que les membres identifiés sur ipb puissent l'être automatiquement sur Presta.

Donc j'ai creusé sur le sujet.

Je suis tombé sur un script tout fait sur cette page :
https://www.invisionpower.com/support/g ... onnect-r27

qui montre un exemple de script en esclave du forum avec la méthode de ips connect décrite ci-dessus.

Voici le code qui m’intéresse :

Code : Tout sélectionner

<?php //----------------------------------------- // Connect to database //----------------------------------------- require_once 'config.php'; $db = new mysqli( $databaseHost, $databaseUsername, $databasePassword, $databaseDatabase ); //----------------------------------------- // Are we logged in? //----------------------------------------- $loggedIn = NULL; // Only do this if the user has not expressly logged out of the IPS Connect Network if ( !isset( $_COOKIE[ 'ipsconnect_' . md5( $masterUrl ) ] ) or $_COOKIE[ 'ipsconnect_' . md5( $masterUrl ) ] ) { // Check local cookies if ( isset( $_COOKIE['ipsce_user'] ) ) { if ( $user = $db->query( "SELECT * FROM members WHERE username='". $db->escape_string( $_COOKIE['ipsce_user'] ) ."'" )->fetch_array() ) { if ( $user['password'] == $_COOKIE['ipsce_pass'] ) { $loggedIn = $user['username']; } } } // Check IPS Connect if ( $loggedIn === NULL and isset( $_COOKIE[ 'ipsconnect_' . md5( $masterUrl ) ] ) and $_COOKIE[ 'ipsconnect_' . md5( $masterUrl ) ] ) { $check = file_get_contents( $masterUrl . '?' . http_build_query( array( 'act' => 'cookies', 'data' => json_encode( $_COOKIE ) ) ) ); if ( $check = @json_decode( $check, TRUE ) and $check['connect_status'] == 'SUCCESS' ) { // Load local member if ( $user = $db->query( "SELECT * FROM members WHERE connect_id=". intval( $check['connect_id'] ) )->fetch_array() ) { // Update local member if ( $user['username'] != $check['connect_username'] or $user['email'] != $check['connect_email'] ) { $db->query( "UPDATE members SET username='". $db->escape_string( $check['connect_username'] ) ."', email='". $db->escape_string( $check['connect_email'] ) ."' WHERE connect_id=". intval( $check['connect_id'] ) .";" ); } } else { // Create local member $db->query( "INSERT INTO members ( username, email, password, connect_id ) VALUES ( '". $db->escape_string( $check['connect_username'] ) ."', '". $db->escape_string( $check['connect_email'] ) ."', '". md5( rand( 1, 10000 ) ) ."', ". intval( $check['connect_id'] ) ." )" ); $user = $db->query( "SELECT * FROM members WHERE connect_id=". intval( $check['connect_id'] ) )->fetch_array(); } // Log in setcookie( 'ipsce_user', $user['username'], time()+60*60*24*30 ); setcookie( 'ipsce_pass', $user['password'], time()+60*60*24*30 ); $loggedIn = $user['username']; } } }
le seul problème c'est que le fameux $password est juste crypté en MD5 alors que prestashop utilise ce type de méthode :

Code : Tout sélectionner

/** * Encrypt password * * @param string $passwd String to encrypt */ public static function encrypt($passwd) { return md5(_COOKIE_KEY_.$passwd); }
donc comment puis je faire pour adapter le code en dessus avec ce type d'encodage MD5 par dessus avec une clé supplémentaire et le password :(

Merci pour votre aide ! 8-|