2010-11-13 20 views
15

J'essaie de configurer mon application (iframe) Facebook pour utiliser OAuth pour l'authentification. J'ai utilisé le python-sdk de Facebook, mais je ne suis pas encore très satisfait du résultat.Facebook OAuth connexion pour les applications de toile iframe affiche une image de logo et une légende Aller à Facebook.com au lieu de se connecter

Le problème est que lorsque je rediriger un utilisateur qui n'a jamais accédé ma demande à la page de connexion, mon iframe Prèsentoir une page intermédiaire laide, comme la suivante:

The page I'm getting

Si l'utilisateur clique Sur le lien "Aller à Facebook.com", elle est ensuite redirigée vers la page "Demande d'autorisation" standard.

Standard Request for Permission page

Est-il possible d'éviter la première page et conduire l'utilisateur directement à la seconde?

Ce problème se produit sur le premier accès pour les utilisateurs qui n'ont pas encore accordé d'autorisation à mon application.

Le code de connexion est basé sur l'exemple OAuth dans le SDK Python:

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

La première page s'affiche si vous êtes connecté sur Facebook? De mon expérience, le comportement est très différent selon si votre utilisateur est connecté sur Facebook ou non, et si votre utilisateur a déjà accepté votre application ou non. –

+0

La page s'affiche jusqu'à ce que l'utilisateur accepte accepte mon application, indépendamment du fait qu'il soit connecté ou non. – abahgat

Répondre

10

Le problème est dû au code utilisé par Facebook pour sortir des iframes. Un bug a été déposée sur le bugzilla Facebook: http://bugs.developers.facebook.net/show_bug.cgi?id=11326

La seule solution connue à ce problème est de faire la première redirection vers https://graph.facebook.com/oauth/authorize? du côté client (par exemple via JavaScript), en utilisant

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

Cela peut être déclenché lorsque l'utilisateur clique sur un élément (par exemple un bouton de connexion) ou chaque fois qu'une page spécifique est visitée (il suffit de l'inclure dans la tête HTML).

+0

Comment la redirection est-elle gérée? Je ne peux pas rediriger vers apps.facebook.com/myapp parce que Facebook autorise uniquement les redirections vers l'URL de mon site. – shmichael

+0

C'est fait par JavaScript (et c'est ce que je n'aime pas de cette solution de contournement). – abahgat

+0

merci cela économise mon temps :) – Xenon

0

La première page est une erreur. Vous pouvez absolument éviter cette page. Le problème est probablement lié à la façon dont vous faites les redirections vers la page de connexion en premier lieu. Sans un échantillon de code, c'est vraiment la meilleure réponse que je puisse donner.

+0

Eh bien, c'est bon à entendre, au moins. Et j'ai mis à jour ma question pour inclure le code que j'utilise. Merci! – abahgat

1

Cela se produit, apparemment en raison d'un bug sur le côté Facebook ... J'ai trouvé cette solution.

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

$loginUrl = your URL 

pourrait fonctionner de cette façon:

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

toujours utiliser ce code dans les balises de script ...

1

oui, top.location.href devrait faire l'affaire. Si vous rencontrez le problème que l'application casse l'iframe, assurez-vous d'utiliser l'URL de la page canvas dans votre redirection, au lieu de canvas url (dans les paramètres de votre application)