2016-07-12 8 views
2

Ich habe benutzerdefinierte Magento-Skript-Datei wie folgt, die Anmeldung nur durch die Weitergabe von E-Mail und Passwort an diese PHP-Datei.Single Signon mit Magento-Account von drupal

Es funktioniert gut, wenn ich einen Anruf vom Browser mache.

Aber ich möchte diesen Aufruf über Drupal Module, die ich erstellt habe, machen.

Wie ich erwartet Anruf von Drupal-Modul passiert und ich bekomme Erfolg Nachricht zu. Aber Login ist nicht passiert.

Meine Ahnung ist, dass Magento einige Login-Einschränkungen, die außerhalb Magento-Stammordner passiert.

Finden Sie die Quelle unten. Drupal Verzeichnis -/www/drupal/ Magento Verzeichnis -/www/drupal/store/

/www/drupal/store/api_config.php

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 'On'); 

require_once (dirname(dirname(realpath(__FILE__))).'/store/app/Mage.php'); 
umask(0); 
Mage::app(); 
Mage::getSingleton('core/session', array('name' => 'frontend')); 
$websiteId = Mage::app()->getWebsite()->getId(); 
$store = Mage::app()->getStore(); 
$response = array(); 

/www /drupal/store/api_login.php

<?php 
require_once "api_config.php"; 

$session = Mage::getSingleton('customer/session'); 
//$session->start(); 

if (isset($_GET['email']) && !empty($_GET['email']) && isset($_GET['password']) && !empty($_GET['password'])) { 
    if (!filter_var($_GET['email'], FILTER_VALIDATE_EMAIL) === false) { 
     $email = $_GET['email']; 
     $password = $_GET['password']; 

     try { 
      if ($session->login($email, $password)) { 
       $response['status'] = 'success'; 
       $response['data'] = array($_GET); 
       $response['message'] = array('User loggedin Successfully.'); 
      } else { 
       $response['status'] = 'error'; 
       $response['data'] = array($_GET); 
       $response['message'] = array('User login failed.'); 
      } 
      if ($session->getCustomer()->getIsJustConfirmed()) { 
       $this->_welcomeCustomer($session->getCustomer(), true); 
      } 
     } catch (Mage_Core_Exception $e) { 
      switch ($e->getCode()) { 
       case Mage_Customer_Model_Customer::EXCEPTION_EMAIL_NOT_CONFIRMED: 
        $value = Mage::helper('customer')->getEmailConfirmationUrl($email); 
        $message = Mage::helper('customer')->__('This account is not confirmed. <a href="%s">Click here</a> to resend confirmation email.', $value); 
        break; 
       case Mage_Customer_Model_Customer::EXCEPTION_INVALID_EMAIL_OR_PASSWORD: 
        $message = $e->getMessage(); 
        break; 
       default: 
        $message = $e->getMessage(); 
      } 
      //$session->addError($message); 
      $response['status'] = 'error'; 
      $response['data'] = array($_GET); 
      $response['message'] = array($message); 
      echo $message; 
      $session->setUsername($email); 
     } catch (Exception $e) { 
      $response['status'] = 'error'; 
      $response['data'] = array($_GET); 
      $response['message'] = array($e); 
      // Mage::logException($e); // PA DSS violation: this exception log can disclose customer password 
     } 
    } else { 
     //$session->addError('Login and password are required.'); 
     $response['status'] = 'error'; 
     $response['data'] = array($_GET); 
     $response['message'] = array('Invalid Email address'); 
    } 
} else { 
    //$session->addError('Login and password are required.'); 
    $response['status'] = 'error'; 
    $response['data'] = array($_GET); 
    $response['message'] = array('Login and password are required.'); 
} 
print_r(json_encode($response, JSON_FORCE_OBJECT));die; 
?> 

/www/drupal/sites/all/modules/single_signon/single_signon.module

<?php 
function single_signon_user_login(&$edit, $account) { 

    //store variable values 
    $postData = array(); 
    $postData['email'] = $account->mail; 
    $postData['password'] = $edit['input']['pass']; 

    $inc = 1; //count of registration 

    if (!empty($postData['email']) && !empty($postData['password'])) { 

     // use of drupal_http_request 
     $data = http_build_query($postData, '', '&'); 
     //$url = url('http://127.0.0.1/drupal/store/api_login.php?'.$data); 
     //$headers = array('Content-Type' => 'application/x-www-form-urlencoded'); 
     //print_r($url); 
     // the actual sending of the data 
     $JSONresponse = drupal_http_request('http://127.0.0.1/drupal/store/[email protected]&password=password'); 
     //print_r($JSONresponse);die; 
     $response = json_decode($JSONresponse->data, true); 

     if ($response['status']=='success') { 
      $inc+=1; 
      $message = 'Logged in successfully('.$inc.')'; 
      drupal_set_message($message, $type = 'status', $repeat = FALSE); //message goes here 
     } else { 
      $message = 'Logged in failed. Due to '.$response['message'].'('.$inc.')'; 
      drupal_set_message($message, $type = 'error ', $repeat = FALSE); 
     } 
    } else { 
     $message = 'Not able to log inside store('.$inc.')'; 
     drupal_set_message($message, $type = 'status', $repeat = FALSE); //message goes here 
    } 
} 
?> 

Irgendwelche Vorschläge für Entdeckungen dieses Rätsel zu lösen wäre wirklich hilfreich.

Antwort

0

Ich bin nicht sicher, es gut zu verstehen: Sie haben ein PHP-Skript mit Daten senden in der URL (GET), um einen Benutzer in einer Sitzung zu verbinden. Und Sie möchten, dass der Drupal-Server es verwendet, um sich direkt mit Ihrem Magento zu verbinden.

Ich denke, dass Ihr Code funktioniert, aber es konnte leider nicht helfen, den Benutzer mit Magento verbinden.

Da dies der Drupal Server ist, der nach der Verbindung fragt, wäre es die Drupal Serversitzung, die verbunden wird und nicht der Navigationsbenutzer.

Wenn der Benutzer in seinem Navigator mit dem Magento-Server verbunden sein muss, muss er der Navigator sein, der das Magento-Skript direkt aufrufen muss. Es könnte in einem iframe oder über Ajax getan werden, denke ich.

Ich denke, Sie können auch einige andere Lösungen finden, wie OAuth, aber es wird viel mehr von Codierung benötigen.

EDIT

fand ich einige interessante Thema zu Ihrem Problem:

Ich glaube, Sie müssen manu Erstellen Sie den Magento-Sitzungscookie im Benutzer-Navigator über das Drupal-Skript.

Sie müssen zurück zu Drupal die SessionID von Magento schicken, mit dieser Methode (ich glaube, Sie überprüfen müssen):

$response['sessionId'] = $session->getEncryptedSessionId(); 

Und innerhalb des Drupal-Skript, müssen Sie um ein neues Cookie mit den Magento-Sitzungsinformationen aufzunehmen. Vielleicht müssen Sie sich einen funktionierenden Magento-Cookie ansehen, um zu sehen, wie er definiert ist und wie er heißt.

if ($response['status']=='success') { 
    ... 
    setcookie('frontend', $response['sessionId'], time() + 3600 * 24 * 180, '/'); 
    ... 
} 

Sie müssen wahrscheinlich in den Einstellungen von Magento den Pfad für Cookies bei '/' deklarieren.

Können Sie ein Beispiel für die Struktur des Session-Cookies von Magento geben?

+0

Auch wenn Sie meine Antwort nicht mögen, ich denke wirklich, dass dies nicht so funktionieren kann wie es ist. Das Magento-Skript muss die Sitzungsinformationen an Drupal zurücksenden, damit Ihr Modul den Sitzungscookie für Magento auf dem Navigator des Benutzers aufzeichnen kann. – TytooF