2010-11-13 3 views
15

Próbuję skonfigurować moją (iframe) aplikację Facebook, aby używać OAuth do uwierzytelniania. Użyłem python-sdk z Facebooka, ale jeszcze nie jestem usatysfakcjonowany wynikiem.Facebook OAuth login dla aplikacji canvas iframe wyświetla obraz logo i podpis Przejdź do Facebook.com zamiast logować się

Problem polega na tym, że kiedy przekierować użytkownika, że ​​nigdy dostępnego mój wniosek do strony logowania, mój iframe diplays brzydką stronę pośredni, taki jak na następujący:

The page I'm getting

Jeśli użytkownik kliknie w linku "Przejdź do Facebook.com", zostaje przekierowana na standardową stronę "Zażądaj pozwolenia".

Standard Request for Permission page

Czy istnieje jakiś sposób, aby uniknąć pierwszą stronę i prowadzi użytkownika prosto do drugiego?

Ten problem występuje przy pierwszym dostępie dla użytkowników, którzy nie udzielili jeszcze żadnego pozwolenia na moją aplikację.

Kod logowania na przykładzie OAuth w Pythonie SDK:

class LoginHandler(BaseHandler): 
    def get(self): 
     verification_code = self.request.get("code") 
     args = dict(client_id=FACEBOOK_APP_ID, redirect_uri=self.request.path_url) 
     if self.request.get("code"): 
      args["client_secret"] = FACEBOOK_APP_SECRET 
      args["code"] = self.request.get("code") 
      raw_response = urllib.urlopen(
       "https://graph.facebook.com/oauth/access_token?" + 
       urllib.urlencode(args)).read() 
      logging.debug("access_token raw response " + raw_response) 
      response = cgi.parse_qs(raw_response) 
      access_token = response["access_token"][-1] 

      # Download the user profile and cache a local instance of the 
      # basic profile info 
      graph = facebook.GraphAPI(access_token) 
      profile = graph.get_object("me") 

      user = User.get_by_key_name(profile["id"]) 
      if not user: 
       user = User(key_name=str(profile["id"]), 
           id=str(profile["id"]), 
           name=profile["name"], 
           firstname=profile["first_name"], 
           profile_url=profile["link"], 
           access_token=access_token) 
       user.put() 
      elif user.access_token != access_token: 
       # we already know this user, but we need to update 
       user.access_token = access_token 
       user.put() 

      set_cookie(self.response, "fb_user", str(profile["id"]), 
         expires=time.time() + 30 * 86400) 

      self.response.headers["P3P"] = 'CP="IDC CURa ADMa OUR IND PHY ONL COM STA"' 
      self.redirect("/") 
     else: 
      self.redirect(
       "https://graph.facebook.com/oauth/authorize?" + 
       urllib.urlencode(args)) 
+0

Czy wyświetla się pierwsza strona, jeśli faktycznie jesteś zalogowany na Facebooku? Z mojego doświadczenia wynika, że ​​zachowanie jest bardzo różne w zależności od tego, czy użytkownik jest zalogowany na Facebooku, czy nie, a jeśli użytkownik już zaakceptował aplikację, czy nie. –

+0

Strona wyświetla się, dopóki użytkownik nie zaakceptuje mojej aplikacji, niezależnie od tego, czy jest zalogowany, czy nie. – abahgat

Odpowiedz

10

Problem jest spowodowany przez kod, którego Facebook używa do usunięcia z ramek iframe. Błąd został złożony na Facebooka Bugzilla: http://bugs.developers.facebook.net/show_bug.cgi?id=11326

Jedynym znanym rozwiązaniem tego problemu jest zrobić pierwszy przekierowanie do https://graph.facebook.com/oauth/authorize? od strony klienta (czyli za pośrednictwem JavaScript), stosując

<script type='text/javascript'> 
top.location.href="https://graph.facebook.com/oauth/authorize?....... 
</script> 

To może być wyzwalane, gdy użytkownik kliknie na jakiś element (np. przycisk logowania) lub gdy dana strona zostanie odwiedzona (wystarczy umieścić ją w nagłówku HTML).

+0

W jaki sposób obsługiwane jest przekierowanie? Nie mogę przekierować do apps.facebook.com/myapp, ponieważ Facebook pozwala przekierowywać tylko do mojego adresu URL witryny. – shmichael

+0

Jest to wykonywane za pomocą JavaScript (i to mi się nie podoba w tym obejściu). – abahgat

+0

dzięki temu oszczędzam mój czas :) – Xenon

0

Na pierwszej stronie jest błąd. Absolutnie możesz uniknąć tej strony. Problem jest prawdopodobnie związany z tym, w jaki sposób przekierowuje się na stronę logowania. Bez próbki kodu to naprawdę najlepsza odpowiedź, jaką mogę dać.

+0

Cóż, dobrze to słyszeć. I zaktualizowałem moje pytanie, aby uwzględnić kod, którego używam. Dzięki! – abahgat

1

To się dzieje, najwyraźniej z powodu błędu po stronie Facebooka ... Znalazłem to rozwiązanie.

<script type="text/javascript"> 
    top.location.href = '<?php echo $loginUrl ?>'; 
</script> 

$loginUrl = your URL 

może działać w ten sposób:

<script type="text/javascript"> 
    top.location.href = 'http://www.yourappUrl.com'; 
</script> 

zawsze użyć tego kodu w tagach skryptu ...

1

tak powinno top.location.href rade. Jeśli pojawi się problem polegający na tym, że aplikacja rozdziela ramkę iframe, upewnij się, że używasz canvasowego adresu URL strony w przekierowaniu zamiast adresu URL (w ustawieniach aplikacji)

Powiązane problemy