2012-04-06 7 views
0

Ich benutze HTML 5, um ein paar Dinge zu entwickeln und Facebook JavaScript SDK innerhalb derselben einzufügen.Facebook - JavaScript SDK - So fragen Sie automatisch um Erlaubnis

Ich habe eine Facebook-Anwendung entwickelt, wo ich will:

1) Wenn der Benutzer in Facebook nicht angemeldet ist, ist es für die Anmeldung gefragt, aber wenn der Benutzer angemeldet ist und öffnet die Anwendung, sollte es fragen für die Persmission automatisch, anstatt dass der Benutzer erneut auf den Link mit FB.LOGIN() klicken muss.

Es gibt einen Stack-Überlauf Frage ist, How do I get my Facebook application to automatically ask for the required permissions post installation, wo sie es tun, indem window.top.location = "<?php echo $loginUrl; ?>"; verwenden, aber wie kann ich diese authenication URL finden in JavaScript?

JavaScript-Code:

<div id="fb-root"></div> 
<script> 
    // Load the SDK asynchronously 
    (function(d){ 
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
     if (d.getElementById(id)) {return;} 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/en_US/all.js"; 
     ref.parentNode.insertBefore(js, ref); 
    }(document)); 

    // Init the SDK upon load 
    window.fbAsyncInit = function() { 
     FB.init({ 
      appId  : 'appid', // App ID 
      channelUrl : '//www.domain.com/channel.html', // Channel file 
      status  : true, // Check login status 
      cookie  : true, // Enable cookies to allow the server to access the session 
      xfbml  : true // Parse XFBML 
     }); 

     FB.getLoginStatus(function(response) { 
      if (response.status === 'connected') { 
       var uid = response.authResponse.userID; 
       var accessToken = response.authResponse.accessToken; 

       document.getElementById('auth-loggedout').style.display = 'none'; 
       document.getElementById('auth-loggedinnotauthenticate').style.display = 'none'; 
       document.getElementById('loginauthenicated').style.display = 'block'; 
      } 
      else 
       if (response.status === 'not_authorized') { 
        window.top.location = "https://www.facebook.com/dialog/oauth?client_id=id&redirect_uri=http://apps.facebook.com/appp/"; 
       } 
       else { 
        window.top.location = "https://www.facebook.com/login.php?api_key=id&skip_api_login=1&display=page&cancel_url=http://apps.facebook.com/appp/"; 
       } 
    }); 
</script> 

Antwort

3

verwenden:

FB.getLoginStatus(function(response) { 
    if (response.authResponse) { 
     fbUserId = response.authResponse.userID; 
     token = response.authResponse.accessToken; 
    } 
    else { 
     FB.login(function(response) { 
      if (response.authResponse) { 
       fbUserId = response.authResponse.userID; 
       token = response.authResponse.accessToken; 
      } 
      else { 
       console.log('User cancelled login or did not fully authorize.'); 
      } 
     }, {scope: 'user_location'}); 
    } 
},true); 
1

Ich denke, dass die beste Option für Sie ist es, die authenticated referrals Funktion nutzen zu können, was bedeutet, dass Facebook Pflege für Sie der Authentifizierung stattfinden wird, zusammen mit den Berechtigungen, die Sie benötigen.

Der Benutzer wird nur dann an Ihre Anwendung weitergeleitet, nachdem der Benutzer den Authentifizierungsprozess durchlaufen hat.

Wenn das aus irgendeinem Grund nicht zu Ihnen passt, lesen Sie bitte die Dokumentation für authentication und vor allem die server-side flow, da es scheint, dass Sie nach was Sie geschrieben haben.

Von Ihrem JavaScript-Code scheint es, dass Sie die Kanal-URL-Eigenschaft nicht verwenden, wenn Sie das Facebook SDK starten. Wie es in der JavaScript SDK documentation (Kanal-Datei Abschnitt) heißt es:

Die Kanal Datei behebt einige Probleme mit Cross-Domain-Kommunikation in bestimmten Browsern

Und dann:

Die Der Parameter channelUrl ist optional, wird jedoch empfohlen.

Ich kann nicht versprechen, dass es es beheben wird, aber es könnte.

Es sollte so aussehen:

// Init the SDK upon load 
window.fbAsyncInit = function() { 
    FB.init({ 
     appId  : 'appid', // App ID 
     channelUrl : '//www.domain.com/channel.html', // Channel File 
     status  : true, // Check login status 
     cookie  : true, // Enable cookies to allow the server to access the session 
     xfbml  : true // Parse XFBML 
    }); 

    FB.getLoginStatus(function(response) { 
     if (response.status === 'connected') { 
      var uid = response.authResponse.userID; 
      var accessToken = response.authResponse.accessToken; 

      document.getElementById('auth-loggedout').style.display = 'none'; 
      document.getElementById('auth-loggedinnotauthenticate').style.display = 'none'; 
      document.getElementById('loginauthenicated').style.display = 'block'; 
     } 
     else 
      if (response.status === 'not_authorized') { 
       window.top.location = "https://www.facebook.com/dialog/oauth?client_id=id&redirect_uri=http://apps.facebook.com/appp/"; 
      } 
      else { 
       window.top.location = "https://www.facebook.com/login.php?api_key=id&skip_api_login=1&display=page&cancel_url=http://apps.facebook.com/appp/"; 
      } 
}); 

// Load the SDK asynchronously 
(function(d){ 
    var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
    if (d.getElementById(id)) {return;} 
    js = d.createElement('script'); js.id = id; js.async = true; 
    js.src = "//connect.facebook.net/en_US/all.js"; 
    ref.parentNode.insertBefore(js, ref); 
}(document)); 

Wie Sie sehen können, müssen Sie zuerst die window.fbAsyncInit Callback-Methode definieren, und erst dann das SDK laden.

+0

Hallo Nitzan, Dank für die Details. https://www.facebook.com/dialog/oauth?client_id=myid&redirect_uri=http://apps.facebook.com/testnamespace Das funktioniert, aber ich habe versucht, 3 Konten zu verwenden. Wenn ein Benutzer zu dieser Zeichenfolge umgeleitet wird, wird in einigen Fällen "Ein Fehler ist aufgetreten. Bitte versuchen Sie es später erneut." Können Sie bitte eine Idee geben? –

+0

Die redirect_uri sollte keine Facebook-Domain-URL sein, wie Sie es geschrieben haben, Sie sollten auf Ihren eigenen Server umleiten, dann müssen Sie verarbeiten, was Sie wollen, und dann den Benutzer zu * http: //apps.facebook umleiten ... . * –

+0

Aber sie haben erwähnt, dass wir das in http://developers.facebook.com/docs/authentication/server-side/ tun können. Auch das funktionierte vor einiger Zeit. Ist es mit langsamen Netzwerk verbunden, wo js nicht richtig geladen ist –

Verwandte Themen