6

Ich verwende Facebook Graph API in der Google App Engine. Ich konnte alle grundlegenden Informationen von einem Benutzer abrufen. Wenn ich jedoch versuchte, Benutzerinformationen abzurufen, für die eine Berechtigung erforderlich ist, z. B. eine E-Mail, wird sie immer als Keine angezeigt. Ich habe das ganze Tutorial unter der developers blog verfolgt.Wie bekomme ich Benutzer-E-Mail mit Facebook Graph API in GAE Python?

Hier ist mein Code:

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 

Und hier ist die Vorlage/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 %} 

Gibt es etwas falsch? Gibt es eine andere Möglichkeit, Benutzer-E-Mails zu erhalten?

+0

Versuchen Sie, einige Debug-Ausgabe des Profils, das Sie von FB erhalten, hinzuzufügen und sehen Sie, ob die E-Mail dort ist. Wenn der FB-Autorisierungsdialog angezeigt wird, enthält er eine E-Mail-Berechtigung? – cope360

Antwort

0

Ihr Code sieht korrekt aus, also würde ich annehmen, dass Sie nicht über die richtigen erweiterten Berechtigungen verfügen. Sie müssen nach der erweiterten E-Mail-Berechtigung fragen, wenn Sie versuchen, die E-Mail-Adresse zu erhalten. Sie finden die Liste der erweiterten Berechtigungen here. Sie müssen diese Berechtigungen anfordern, bevor Sie diese Eigenschaften mithilfe der Graph-API lesen können.

+1

Er hat perms = "email" im Login Button Tag. Das sollte zur Erlaubnis auffordern. – cope360

1

E-Mail wird auf Benutzer erstellen geschrieben. Vielleicht versuchen Sie, auf Benutzer zuzugreifen, die erstellt wurden, als Sie keine E-Mail-Berechtigung hatten, daher war die geschriebene E-Mail-Adresse None. Erscheint das Problem auch für ein neues Benutzerobjekt?