2011-03-26 61 views
0

1)用戶點擊這是做FB連接的正確方法?

2) '用Facebook登錄' 將用戶重定向到http://www.facebook.com/dialog/oauth?client_id=xx&redirect_url=xxx&etcetc

3)用戶點擊允許,返回到我們的網站。

4)我們能夠獲取用戶的姓名,電子郵件和我們有許可其他設置,使用我們能夠在我們網站上創建一個帳戶,他隨機密碼。

5)下一次用戶點擊這個按鈕,如果我們已經有他的賬戶上我們的網站(使用電子郵件地址進行比較),我們簡單地自動登錄他在第4步

+0

爲什麼不使用Facebook PHP SDK? https://github.com/facebook/php-sdk/ – 2011-03-26 02:05:43

+0

@Russel我使用笨,不知道這將是多麼容易整合。通過這種方法使用SDK有什麼特別的優勢嗎? – 2011-03-26 02:07:29

+0

不知道CI,但是,在Kohana中,您可以通過將其放置在供應商文件夾中來輕鬆添加*供應商*代碼。也許CI有類似的東西。至於優點,這是一個開源,經過嘗試和測試的系統,被許多人所使用。因此它將比定製的實現更強大和更安全。 – 2011-03-26 04:16:34

回答

1

絕對使用SDK。它的好處是它是一個在野外測試和使用的庫。永遠不會重建輪時,你不必(你會發現,你完成更多工作;))。

我最終什麼事在CI做的是Facebook的PHP SDK添加到我的圖書館目錄並更改Facebook__construct功能是:

public function __construct() 
{ 
    $ci =& get_instance(); 

    $this->setAppId($ci->config->item('fb_appId')); 
    $this->setApiSecret($ci->config->item('fb_secret')); 
    $this->setCookieSupport($ci->config->item('fb_cookie')); 
    $this->setBaseDomain($ci->config->item('fb_domain')); 
    $this->setFileUploadSupport($ci->config->item('fb_upload')); 
} 

然後,

  • 我將以上所有鍵/值對添加到config/config.php
  • 將facebook庫添加到自動載入列表

這項工作完成,我可以從任何地方通過$this->facebook訪問FB API在我的應用程序。

說了這麼多,這是所有預先2.0,所以我不能完全肯定,如果需要(我使用Yii現在,這主要是爲什麼我不知道,如果變化是變化會是什麼需要:))。

希望有所幫助。

編輯:

按照要求,我最終加入UserModel類(擴展Model)。我支持多個登錄提供者,所以我不會發布整個事情。但是,這是它的要點:

class UserModel extends Model 
{ 
     private $m_user; 

     public function UserModel() 
     { 
       parent::Model(); 

       $this->m_user = null; 

       $session = $this->facebook->getSession(); 
       if($session) 
       { 
         if($this->facebook->api('/me') != null) 
         { 
           $this->m_user = $this->facebook->api('/me'); 
         } 
       } 
     } 

     public function getUser() 
     { 
       return $this->m_user; 
     } 

     public function isLoggedIn() 
     { 
       return $this->getUser() != null; 
     } 

     // returns either the login or logout url for the given provider, relative to the 
     // state that the current user object is in 
     public function getActionUrl() 
     { 
       if($this->isLoggedIn()) 
       { 
         return $this->facebook->getLogouturl(); 
       } 
       else 
       { 
         return $this->facebook->getLoginUrl(array('next'=>currentUrl(), 'cancel'=>currentUrl(), 'req_perms'=>null, 'display'=>'popup')); 
       } 
     } 
} 

然後,我添加了一個登錄窗口小部件,它只是包含此:

<div id="header-login"> 
     <!-- todo: this won't work with konqueror atm (fb script bugs) - check 'em out later --> 
     <?php if(!$user->isLoggedIn()): ?> 
     <fb:login-button perms="email"><?php echo lang('fb_login'); ?></fb:login-button> 
     <?php else: ?> 
     <a onclick="FB.logout();" class="fb_button fb_button_medium"><span class="fb_button_text">Logout</span></a> 
     <?php endif; ?> 
</div> 

第二個編輯:

對不起,它是一個而自從我寫這篇文章以來,所以我不得不回頭弄清楚它是如何實現的:P經過快速的grep,我發現我實際上並沒有在任何地方使用getActionUrl。我添加了一些客戶端腳本來收聽FB登錄/註銷事件:

google.setOnLoadCallback(on_load); 
google.load("jquery", "1.4.4"); 

window.fbAsyncInit = function() { 
     FB.init({appId: '[id]', status: true, cookie: true, xfbml: true}); 
     FB.Event.subscribe('auth.login', on_fb_login); 
     FB.Event.subscribe('auth.logout', on_fb_logout); 
}; 

function on_load() 
{ 
     // force all anchors with the rel tag "ext" to open in an external window 
     // (replaces target= functionality) 
     $('a[rel="ext"]').click(function(){ 
       window.open(this.href); 
       return false; 
     }); 
} 

function on_fb_login() 
{ 
     location.reload(); 
} 

function on_fb_logout() 
{ 
     location.reload(); 
} 
+0

你可以分享你將如何實現登錄/ Facebook連接使用該方法? – 2011-03-26 02:35:41