2011-08-31 228 views
0

我正試圖通過facebook實現登錄和註冊系統。我使用的代碼如下:Facebook登錄按鈕問題

<div id="fb-root"></div> 

<script type="text/javascript"> 
window.fbAsyncInit = function() { 
FB.init({appId: 'MYAPPIDHERE', status: true, cookie: true, xfbml: true}); 

    FB.Event.subscribe('auth.login', function(response) { 
     window.location = "https://domain.com/fblogin.aspx"; 
    }); 
    FB.Event.subscribe('auth.logout', function(response) { 
     window.location.reload(); 
    }); 

}; 
(function() { 
     var e = document.createElement('script'); 
     e.type = 'text/javascript'; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     e.async = true; 
     document.getElementById('fb-root').appendChild(e); 
}()); 

</script> 

<fb:login-button autologoutlink="true" perms="email,offline_access" registration-url="https://domain.com/register_fb.aspx" /> 

我需要一些建議。目前,如果我登錄Facebook,頁面會自動觸發'auth.login'事件並將我重定向到我的應用程序。它很好用,但我想阻止這種行爲。在理想的世界中,如果Facebook登錄按鈕在點擊時只激發「auth.login」事件,那將會很不錯。

你的想法是什麼?我是否應該取消fb:登錄按鈕並創建與onclick事件綁定的自己的按鈕?如果是的話,你有什麼好的例子可以分享?

謝謝

回答

1

我認爲你應該保留你的代碼。給FB:登錄按鈕的ID(比如ID = 「fb_loginbutton」)和包裝你......

window.location = "https://domain.com/fblogin.aspx"; 

...弄成這個樣子......

var fb_loginbutton = document.getElementById('fb_loginbutton'); 
fb_loginbutton.onclick = function() { 
    window.location = "https://domain.com/fblogin.aspx"; 
} 

(這進入Event.subscribe ... auth.login函數。)

這樣,成功的登錄操作不會重定向瀏覽器,而只是在點擊按鈕時重定向。

如果Facebook的按鈕,不說了正確的事情,那麼你可以改變它的HTML多說一些有用的......

fb_loginbutton.innerHTML = "Click here to continue"; 

...或滾你自己。

我希望有幫助!

+0

感謝您的建議。您的建議有些作用,但在我輸入Facebook憑證後需要額外點擊才能「繼續」。此外,我不知何故會想方式來重定向用戶到我的自定義Facebook註冊頁面,如果用戶目前沒有連接到我的應用程序。 –

+0

我想我明白你在問什麼 - 如果用戶已經登錄到Facebook,那麼他們需要點擊按鈕登錄到你的網站,但一旦他們完成了Facebook登錄並返回,他們不應該需要再次點擊它? [這裏有一個非常好的教程可能會有所幫助](http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/)。另外,您可以將redirect_uri參數傳遞給FB.login調用,該調用可以向您的代碼返回一個GET值,例如「return_from_facebook = true」,這會自動激發按鈕。 – JoLoCo

+0

JoLoCo感謝您的鏈接 –

0

更新我設法找到一個可行的解決方案:

<div id="fb-root"></div> 
<script type="text/javascript"> 
window.fbAsyncInit = function() { 
FB.init({appId: 'MYAPPID', status: true, cookie: true, xfbml: true}); 

    FB.Event.subscribe('auth.login', function(response) { 
     login(); 
    }); 

    FB.getLoginStatus(function(response) { 
     if (response.session) { 
      login(); 
     } 
    }); 

}; 
(function() { 
     var e = document.createElement('script'); 
     e.type = 'text/javascript'; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     e.async = true; 
     document.getElementById('fb-root').appendChild(e); 
}()); 

function login() { 

    var fb_loginbutton = document.getElementById('fb_loginbutton'); 

    $('.fb_button_text').html('Continue to your account...'); 

    fb_loginbutton.onclick = function() { 
     window.location = "https://domain.com/login_controller.aspx"; 
    } 

} 
</script> 

我login_controller.aspx頁面看起來是這樣的:

保護小組的Page_Load(BYVAL發件人爲對象,BYVALË作爲System.EventArgs)把手Me.Load

Dim FacebookAPPID As String = "MY_FB_APP_ID" 

If Request.Cookies("fbs_" & FaceBookAppID) Is Nothing Then 
    'Response.Redirect("error.aspx") 
End If 

Dim cookie As String = Request.Cookies("fbs_" & FaceBookAppID).Value 
cookie = cookie.Replace("""", "") 

Dim facebookValues As NameValueCollection = HttpUtility.ParseQueryString(cookie) 

'Response.Write(facebookValues("access_token")) 
'Response.Write("<br><br>") 
'Response.Write(facebookValues("secret")) 
'Response.Write("<br><br>") 
'Response.Write(facebookValues("session_key")) 
'Response.Write("<br><br>") 
'Response.Write(facebookValues("sig")) 
'Response.Write("<br><br>") 
'Response.Write(facebookValues("uid")) 

doLogin(facebookValues("uid").ToString) 

末次

我有一個q uestion>在我的數據庫中存儲某種AES加密字符串和facebook用戶標識是否有用?我使用的這個過程中,登記要求:

<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
    FB.init({appId: 'MY_APP_ID', status: true, cookie: true, xfbml: true}); 
    }; 
    (function() { 
    var e = document.createElement('script'); e.async = true; 
    e.src = document.location.protocol + 
     '//connect.facebook.net/en_US/all.js'; 
    document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 


<fb:registration fields="[{'name':'name', 'view':'prefilled'},{'name':'username', 'view':'not_prefilled', 'description':'Username','type':'text'},{'name':'password', 'view':'not_prefilled', 'description':'Password','type':'text'},{'name':'lastname', 'description':'Last name','type':'text'},{'name':'email'},{'name':'accountnumber', 'description': ' Account number','type':'text'}]" onvalidate="validate_async" redirect-uri="https://domain.com/fbregister.aspx"></fb:registration> 

<script> 
function validate_async(form, cb) { 

    tmp = form.accountnumber; 
    tmp = tmp.split("-"); 

    if (tmp.length != 2) { 
     cb({'accountnumber': 'Please include the dash in your account number. Example: xxxxx-xxxxxx.'}); 
    } 

    if (form.username) { 

     if (form.username.length > 0) { 

      $.getJSON('checkUsernameExists.aspx?username=' + form.username, 
       function(response) { 
        if (response.error) { 
         cb({username: 'That username is taken'}); 
        } 
        cb(); 
      }); 

     } 

    } else { 
     cb(); 
    } 

} 
</script> 

我fbregister.aspx使用JSON.net庫來解析Facebook的迴應:

昏暗FBAppID作爲字符串,FBSecret作爲字符串,數據作爲JObject FBAppID = 「MY_FB_ID」 FBSecret = 「MY_FB_SECRET」

data = ClientSite.Classes.Facebook.DecodeFacebookRequest(HttpContext.Current.Request.Form("signed_request"), FBSecret) 

Response.Write(data) 

會的最佳實踐是什麼存儲的用戶ID與密碼嗎?我正在考慮使用AES來加密密碼。用戶標識符會通過,Facebook的祕密將是鹽,而系統生成的機器鍵是文本。

當有人試圖使用Facebook登錄時,它會生成一個加密的密碼,並將其與存儲在數據庫中的密碼進行比較。這基本上會提供額外的安全層。思考?