2010-04-26 28 views
21

Kullanıcıları javascript açılır penceresinden doğrulamak için Facebook'u almaya çalışıyorum.Facebook Grafik API'sı ile popup kimlik doğrulamanın basit bir örneği

<input type="button" value="Connect with Facebook" onclick="window.open('https://graph.facebook.com/oauth/authorize?client_id=XXXXXXXXXXX&redirect_uri=http://example.com/step2&display=popup')" /> 

Ama kullanıcı Facebook üzerinden açtığında, pop-up sadece Facebook.com ana sayfasını görüntüler: Şu anda, var. Açılırken kullanıcının kimliğini doğrulamak ve kullanıcı verilerini grafik api'den almaya başlayabilmek için uzaklaşmak istiyorum.

Bunu yapmanın daha iyi/daha kolay bir yolu var mı? Basit örnekler takdir edilir.

Teşekkür ederiz.

cevap

27

facebook'ta oauth2 iki adımı içerir, kod almak için yetkilendirme çağrısı yapın, daha sonra jeton almak için access_token öğesini arayın. Pop ile giriş yapmanın bir yolu:

açık oturum açma URL'sini, tıpkı sizin yaptığınız gibi, facebook açılır pencerenizdeki URL'nize yeniden yönlendirdiğinde, çerezleri sunucu tarafı koduyla veya javascript kullanarak ayarlayabilirsiniz. url sorgu parametresini yakaladığınızda, sayfa açılır pencerede yüklendiğinde, pencereyi hemen kapatın. Ana sayfada

, senin window.open kodundan sonra, pop-up kapalıysa algılamak için JavaScript kodu eklemek ve çerez yakalamak:

var signinWin; 
$('#FacebookBtn').click(function() { 
     var pos = screenCenterPos(800, 500); 
     signinWin = window.open("[URL]", "SignIn", "width=780,height=410,toolbar=0,scrollbars=0,status=0,resizable=0,location=0,menuBar=0,left=" + pos.x + ",top=" + pos.y); 
     setTimeout(CheckLoginStatus, 2000); 
     signinWin.focus(); 
     return false; 
    }); 

function CheckLoginStatus() { 
    if (signinWin.closed) { 
     $('#UserInfo').text($.cookie("some_cookie"); 
    } 
    else setTimeout(CheckLoginStatus, 1000); 
} 
+27

yerine (umduğunuzdan daha fazla gecikme olabilir) orijinal pencerede bir zamanlayıcı, açılan pencerede çalışacaktır yönlendirme url bir komut dosyası kullanabilirsiniz kullanarak: if (opener && ""! = opener.location) { \t opener.handler(); } window.close(); Bu, açılış penceresindeki işleyiciyi() çağırır ve açılır pencereyi kapatır. İşleyici yalnızca ana pencere hala açılmışsa ve farklı bir alana gitmiyorsa çağrılır. – Avner

+3

Sanırım screenCenterPos işlevi eksik. –

+1

'$ ('# UserInfo'), metin ($. Cookie (" some_cookie ");' $ ('# UserInfo') olmalıdır, metin ($. Cookie ("some_cookie")); '. Eksiksiniz kapanış ')'. – Gogol

2

Avner, pencerenin kapanmasını izleyen bir zamanlayıcının yanı sıra, hem Çocuk penceresinden bir geri arama işlevi yapmak iyi bir fikir olabilir. Bu şekilde, Çocuk penceresi belirli bir eylem olmadan kapatılırsa, Ana pencerede uygun eylemi gerçekleştirebilirsiniz.

**On Child** 
// Set oAuthToken from server side when it comes back from authenticating 
// and you have the token on the server side. 
var oAuthToken = ""; 
oAuthToken = "--STRING INSERTED BY SERVER SIDE CODE--"; 
window.opener.pbFromPopup(oAuthToken); 

**On Parent :** 
     function CheckLoginStatus() { 
      if (authWindow.closed) { 
       // Handle error if authentication window is closed 
       // without any action on Allow or Deny 
       alert("window closed");     
       //location.href = "errorPage.aspx?error=authwinclosed; 
      } 
      else setTimeout(CheckLoginStatus, 1000); 
     } 
     function pbFromPopup(token) { 
      // Function called from child window, 
      // token is passed back from child 
      authWindow.close(); 
      // Put token in a hidden form field and submit the form to pass 
      // it back to the server 
      $("#authToken").val(token); 
      $("#form1").submit(); 
     }