Facebook App - Facebook Api problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Facebook App - Facebook Api problem

    Hallo zusammen,

    ich Entwickle momentan eine kleine Facebook Seite für jemanden. Die Anforderungen sind, dass diese Seite in einem iFrame Tab auf der "Unternehmensseite" (Chronik) erreichbar sein soll, wenn man nicht eingeloggt ist sich via Facebook Login einloggen kann und wenn man kein Fan ist, dass man die Inhalte erst sieht, wenn man die Seite Liked.

    Jetzt stehe ich vor dem Problem, dass es soweit eigentlich funktioniert, allerdings nicht Browserübergreifend...

    • Im IE hab ich das Problem, das nachdem per oAuth erlaubt wurde, oder per Facebook eingeloggt wurde, die Seite anscheinend immer weitergeleitet wird und der Popup sich erneut öffnet, allerdings innerhalb von Millisekunden auch wieder schließt.
    • Im Firefox/Chrome geht es, außer das der Popup vom oAuth/Login geblockt wird.
    • Im Safari wird der oAuth in einem Tab, anstatt in einem Popup geöffnet, funktioniert aber nach erlauben bzw. einloggen.
    • In Opera öffnet sich der oAuth auch in einem Tab anstatt in einem Popup. Wenn man sich allerdings einloggt bzw. die App erlaubt, bleibt der Tab offen und die Seite lädt sich nicht neu, man muss sie von Hand aktualisieren.


    Hier kommt jetzt der relevante Code:

    PHP-Code:
    <?php
    require_once('./classes/facebook/facebook.php');
    require_once(
    './classes/facebook/facebookhandler.class.php');
    require_once(
    './app/mapping.php');

    define(PAGE_ID'xxx');
    define(APP_ID'xxx');
    define(SITE_SECRET'xxx');
    define(REDIRECT_URI'xxx');

    $facebook = new Facebook(array(
            
    'appId'  => APP_ID,
            
    'secret' => SITE_SECRET,
            
    'cookie' => true
    ));

    // access Token
    $accessToken $facebook->getAccessToken();

    // own uri
    $uri 'http'. ($_SERVER['SERVER_PORT'] != "80"  's' null) .'://'$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

    // user
    $user $facebook->getUser();

    include 
    './templates/global/header.tpl';

    if(
    $user)
    {
        try
        {
            
    $userProfile $facebook->api('/me');
        } 
        catch (
    FacebookApiException $e)
        {
            
    $user null;
            
    $userProfile false;
        }

    }
    else
    {
        
    $userProfile false;
    }

    if (
    $userProfile)
    {
        
    $facebookHandler = new facebookhandler();
        
    $facebookHandler->setLikeStatus($facebook->api($user.'/likes/' PAGE_ID));
        
    $facebookHandler->setUser($facebook->api("/me"));
        
    $like $facebookHandler->getLikeStatus();

        if(
    $like)
        {
            
    $ret true;
        }
        else
        {
            
    $ret false;
        }
    }
    else
    {
        
    $ret false;
        echo 
    '
        <script src="http://connect.facebook.net/en_US/all.js"></script>
        <div id="fb-root"></div>
        <script>
            FB.init({
                appId: "' 
    APP_ID '",
                xfbml: true,
                cookie: true,
                oauth: true
            });
            
            FB.login({scope: "publish_stream"});
            
            FB.Event.subscribe("auth.login", function(response) {
                window.setTimeout(function () {
                    location.reload(true);
                },0);
            });
        </script>
        <fb:login-button></fb:login-button>'
    ;
    }
    Kann mir da jemand weiterhelfen?

    LG

    Pit

  • #2
    Zitat von PitPanda Beitrag anzeigen
    Im IE hab ich das Problem, das nachdem per oAuth erlaubt wurde, oder per Facebook eingeloggt wurde, die Seite anscheinend immer weitergeleitet wird und der Popup sich erneut öffnet, allerdings innerhalb von Millisekunden auch wieder schließt.
    Das wird ein Third-Party-Cookie-Problem sein.

    Deine Seite von einer anderen Domain läuft im Iframe unter facebook.com, also bist du eine „Drittpartei“, und Cookies von deiner Seite werden dann ggf. geblockt.
    Einen P3P-Policy-Header zu setzen, hilft in den meisten Fällen.

    Im Firefox/Chrome geht es, außer das der Popup vom oAuth/Login geblockt wird.
    Das kann dir in jedem Browser passieren, der entsprechend eingestellt ist. Popups zu blocken, die ohne Nutzerinteraktion ausgelöst werden, ist in den meisten aktuellen Browsern heute die Popupblocker-Defaulteinstellung.

    Entweder rufst du FB.login erst auf einen Klick auf einen Link/Button hin auf – oder, wenn du den Login partout ohne Nutzerinteraktion aufrufen willst, wechselst du zum server-side flow, und leitest per top.location.href zu dessen Adresse weiter (das kann von der Weiterleitung zurück zu deiner App dann aber problematisch werden, Facebook kann ziemlich komisch sein darin, was sie für einen „korrekten“ redirect_uri halten).

    Im Safari wird der oAuth in einem Tab, anstatt in einem Popup geöffnet
    Sowas ist Einstellungssache im Browser, da hast du keinen Einfluss drauf.

    In Opera öffnet sich der oAuth auch in einem Tab anstatt in einem Popup. Wenn man sich allerdings einloggt bzw. die App erlaubt, bleibt der Tab offen und die Seite lädt sich nicht neu, man muss sie von Hand aktualisieren.
    K.A. woran das liegt, damit habe ich normalerweise keine Probleme.
    Aber das mit dem direkten FB.login-Aufruf solltest du eh erst mal fixen.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Noch ein paar Punkte:

      Zitat von PitPanda Beitrag anzeigen
      PHP-Code:
      // access Token
      $accessToken $facebook->getAccessToken(); 
      Wozu? Die Variable benutzt du anschließend nicht mehr.

      PHP-Code:
      // own uri
      $uri 'http'. ($_SERVER['SERVER_PORT'] != "80"  's' null) .'://'$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
      Wozu? Die Variable benutzt du anschließend nicht mehr.
      Abgesehen davon, ist $_SERVER['HTTPS'] m.E. besser geeignet um herauszufinden, ob der Aufruf über HTTPS erfolgte.

      PHP-Code:
          $facebookHandler->setLikeStatus($facebook->api($user.'/likes/' PAGE_ID)); 
      Das wird nicht funktionieren, solange du den Nutzer nicht auch nach der Berechtigung fragst, seine Likes zu lesen.

      Brauchst du aber auch gar nicht, weil du innerhalb eines Page Tabs diese Information direkt im signed_request findest.
      (Achtung, der ist nur beim ersten Seitenaufruf im Iframe gesetzt. Ergebnis von Facebook::getSignedRequest in die Session speichern, wenn immer der Wert nicht false ist, wäre meine Empfehlung. Abfrage auf false oder nicht, damit du Änderungen auch mitbekommst, und nicht der initiale Status auf ewig in der Session bleibt.)

      PHP-Code:
          echo '
          <script src="http://connect.facebook.net/en_US/all.js"></script> 
      Für eine Seite hauptsächlich für Nutzer aus Deutschland(?) würde ich hier die de_DE-Variante des JavaScript SDK einbinden.

      Außerdem solltest du hier die Protokoll-Angabe weglassen, sonst bekommen Nutzer die per HTTPS die Seite besuchen Sicherheitswarnungen. (Also src="//connect.facebook.net/…")

      Und zusätzlich wäre zu überlegen, ob du das SDK nicht lieber asynchron laden willst, so wie es die Doku auch empfiehlt.


      Und zu guter letzt, warum benutzt du eigentlich FB.login und <fb:login-button> parallel …?
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Hey,

        danke für die Antworten. An den Signed Request habe ich auch schon gedacht, aber wie du schon gesagt hast ist er nur beim ersten Aufruf da. Wie sieht es dann aus, wenn jemand die Seite nicht liked und dann auf Like klickt? Steht der Like beim Neuladen der Seite dann in dem request?

        Zu den Variablen, da hast du recht ich verwende diese nicht mehr, habe sie nur aus faulheit nicht mehr rausgehauen.

        Das JavaScript kommt von einem Arbeitskollegen, ist schon etwas Älter. Ich werde es wohl nachladen, geht auch schneller, weil der ganze Request an Facebook schon ewig dauert.

        PHP-Code:
        $facebookHandler->setLikeStatus($facebook->api($user.'/likes/' PAGE_ID)); 
        In die Verzweigung gehts erst, wenn die Berechtigung besteht und der User eingeloggt ist. Funktioniert momentan ohne Probleme.

        Bezüglich des Deutschen Skripts von Facebook. Mein Kollege hat internationale Kunden, nicht nur Deutsche.

        Wegen des Login Events, du hast recht, es macht keinen sinn den Button einzubinden, wenn man den Dialog erzwingt, ich werde nur den Button anzeigen und die Login Funktion rausnehmen.

        Ich werde jetzt mal mit dem Signed Request rumspielen, hatte es ganz am Anfang auch schonmal so gelöst, bis ich gemerkt habe das dass nicht immer drin steht.

        LG
        Pit

        Kommentar


        • #5
          Zitat von PitPanda Beitrag anzeigen
          An den Signed Request habe ich auch schon gedacht, aber wie du schon gesagt hast ist er nur beim ersten Aufruf da.
          Er ist immer dann vorhanden, wenn Facebook deine Seite in den Iframe hineinlädt. Nach dem Herumnavigieren im Iframe über eigene Links dann natürlich nicht mehr.

          Wie sieht es dann aus, wenn jemand die Seite nicht liked und dann auf Like klickt? Steht der Like beim Neuladen der Seite dann in dem request?
          Ja. Und das Neuladen geschieht automatisch, wenn es sich um den Button oben über dem Page Tab Iframe handelt.
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Habs jetzt so wie du sagtest gemacht. Ich schmeiße mein signed_request einfach in die Session rein, wenn Sie frisch ist, dann bleibt sie immer da. Die App läuft jetzt soweit stabil, nur leider im Opera teilweise nicht, weils in einem Tab geöffnet wird, aber daran störe ich mich jetzt mal nicht, dann muss man halt von Hand die Seite neuladen.

            Jetzt schlag ich mich erstmal mit einem Prepared Select Statement rum. Muss man immer bind_result benutzen? ist doch Müll ^^ (mysqli)

            Kommentar

            Lädt...
            X