6

Estoy usando Facebook Graph API en Google App Engine. Pude buscar toda la información básica de un usuario. Sin embargo, cuando traté de buscar información de usuario que requiere permiso, por ejemplo, correo electrónico, siempre aparece como Ninguno. He seguido todo el tutorial disponible en el developers blog.¿Cómo obtengo el correo electrónico del usuario usando Facebook Graph API en GAE Python?

Aquí está mi código:

class User(db.Model): 
    id = db.StringProperty(required=True) 
    created = db.DateTimeProperty(auto_now_add=True) 
    updated = db.DateTimeProperty(auto_now=True) 
    name = db.StringProperty(required=True) 
    email = db.StringProperty(required=True) 
    profile_url = db.StringProperty(required=True) 
    access_token = db.StringProperty(required=True) 


class BaseHandler(webapp.RequestHandler): 
    """Provides access to the active Facebook user in self.current_user 

    The property is lazy-loaded on first access, using the cookie saved 
    by the Facebook JavaScript SDK to determine the user ID of the active 
    user. See http://developers.facebook.com/docs/authentication/ for 
    more information. 
    """ 
    @property 
    def current_user(self): 
     if not hasattr(self, "_current_user"): 
      self._current_user = None 
      cookie = facebook.get_user_from_cookie(
       self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) 
      if cookie: 
       # Store a local instance of the user data so we don't need 
       # a round-trip to Facebook on every request 
       user = User.get_by_key_name(cookie["uid"]) 
       if not user: 
        graph = facebook.GraphAPI(cookie["access_token"]) 
        profile = graph.get_object("me") 
        user = User(key_name=str(profile["id"]), 
           id=str(profile["id"]), 
           name=profile["name"], 
           email=profile["email"], 
           profile_url=profile["link"], 
           access_token=cookie["access_token"]) 
        user.put() 
       elif user.access_token != cookie["access_token"]: 
        user.access_token = cookie["access_token"] 
        user.put() 
       self._current_user = user 
     return self._current_user 

Y aquí es la plantilla/HTML:

<fb:login-button autologoutlink="true" perms="email"></fb:login-button> 

{% if current_user %} 
    <p><a href="{{ current_user.profile_url }}"><img src="http://graph.facebook.com/{{ current_user.id }}/picture?type=square"/></a></p> 
    <p>Hello, {{ current_user.name|escape }}</p> 
    <p>email: {{ current_user.email }} </p> 
{% endif %} 

¿Hay algo mal? ¿Hay alguna otra manera de obtener el correo electrónico del usuario?

+0

Intente agregar alguna salida de depuración del perfil que obtiene de FB y verifique si el correo electrónico está allí. Cuando aparece el cuadro de diálogo de autorización de FB, ¿incluye el permiso de correo electrónico? – cope360

Respuesta

0

Tu código se ve correctamente así que supongo que no tienes los permisos extendidos correctos. Debe solicitar el permiso extendido de "correo electrónico" si va a tratar de obtener la dirección de correo electrónico. Puede encontrar la lista de permisos extendidos here. Debe solicitar estos permisos antes de poder leer estas propiedades utilizando Graph API.

+1

Tiene perms = "email" en la etiqueta del botón de inicio de sesión. Eso debería solicitar el permiso. – cope360

1

El correo electrónico está escrito en Creación de usuario. Tal vez está tratando de acceder a los usuarios que se crearon cuando no tenía permiso de correo electrónico, por lo tanto, el correo electrónico escrito era Ninguno. ¿El problema aparece también para el nuevo objeto Usuario?

Cuestiones relacionadas