2014-06-11 151 views
1

我想鏈接與magento的Web應用程序,以便當用戶登錄到Web應用程序時,他/她也會自動登錄到magento。magento登錄從外部網站,跨域

爲了簡單起見,我用一個簡單的登錄表單對它進行了測試。所以現在我安裝了magento,一個自定義API編寫的自定義模塊和一個調用登錄API嘗試驗證用戶的PHP表單。

的API型號代碼片段:在PHP形式

class Modulename_Model_Api extends Mage_Api_Model_Resource_Abstract 
{ 
    function login($email, $password) 
    { 
     Mage::app()->setCurrentStore("default"); 
     Mage::getSingleton('core/session'); 

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

     if($session->login($email, $password)) { 
      return $session->getSessionId(); 
     } else { 
      $this->_fault('login_fail'); 
      return false; 
     } 
    } 
} 

代碼片段:

<?php 

if (isset($_POST['email']) && isset($_POST['password'])) { 
    $proxy = new SoapClient('http://www.domain.com/magento/api/?wsdl'); 
    $sessionId = $proxy->login('apiuser', 'apikey'); 

    try { 
     $token = $proxy->call($sessionId, 'customer.login', array(
      'email'=>$_POST['email'], 
      'password'=>$_POST['password'] 
     )); 
    } catch (Exception $e) { 
     echo $e->faultstring; 
    } 

    if ($token) { 
     setcookie('frontend', $token, time()+3600, "/magento/", ".domain.com"); 
     header('Location: http://www.domain.com/magento/'); 
    } else { 
     //some error handling 
    } 

} 

?> 

<form method="POST"> 
    <input type="text" name="email"/> 
    <input type="password" name="password"/> 
    <input type="submit" value="Login" /> 
</form> 

到目前爲止,登錄形式完美。 但是,當我嘗試將PHP表單放入另一個域時,它失敗。

我可以從API調用中獲取會話ID。所以我最好的猜測是當我嘗試使用跨域的會話ID設置cookie時出現問題。

任何人都可以請幫忙嗎?

回答

0

你是對的。當在與Magento後端相同的域上設置會話Cookie時,Magento能夠讀取並登錄。但是,當您嘗試從不同的域中設置它時,由於跨域cookie限制(http://en.wikipedia.org/wiki/HTTP_cookie#Privacy_and_third-party_cookies),您的瀏覽器不允許它, 。如果您試圖從不同的域登錄您的客戶,您應該使用Magento的OAuth API(http://www.magentocommerce.com/api/rest/introduction.html)。

因此,基本上您的web應用程序將充當OAuth使用者,而Magento將充當OAuth提供者。任何登錄您網站的用戶都將首先登錄到Magento。完成OAuth舞蹈並且您的webapp從Magento獲取OAuth訪問令牌後,您可以使用您自己的驗證模塊來處理使用此訪問令牌的驗證/授權。

這個解決方案將首先登錄到Magento,然後「自動」登錄到您的網站。