Как получить электронную почту пользователя, используя API Facebook Graph API в Gae Python?

StackOverflow https://stackoverflow.com/questions/4005963

Вопрос

Я использую Facebook Graph API на Google App Engine. Я смог получить всю основную информацию от пользователя. Однако, когда я попытался получить любую информацию о пользователе, которая требует разрешения, электронного письма для экземпляра, она всегда выглядит как никого. Я следовал за всем руководством, доступным на Разработчики блог.

Вот мой код:

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

А вот шаблон / 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 %}

Здесь что-то не так? Есть ли другой способ получить пользовательскую электронную почту?

Это было полезно?

Решение 2

Просто сдался, используя Facebook.py.py. а также Facebookoauth.py. и сделал свой собственный клиент OAUTH 2, используя URLFetch. Видеть «Аутентификация пользователей в веб-приложении» В Facebook Docs.

Кроме того, я положил scope='email' в запросах к https://graph.facebook.com/oauth/authorize? а также https://graph.facebook.com/oauth/access_token?.

Другие советы

Электронная почта написана на создании пользователя. Может быть, вы пытаетесь получить доступ к пользователям, которые были созданы, когда у вас не было разрешения электронной почты, поэтому письменное письмо было никто. Означает ли проблема для нового объекта пользователя?

Ваш код выглядит правильно, поэтому я предполагаю, что у вас нет правильных расширенных разрешений. Вы должны попросить «электронную почту» расширенного разрешения, если вы собираетесь попытаться получить адрес электронной почты. Вы можете найти список расширенных разрешений здесь. Отказ Вы должны просить эти разрешения, прежде чем вы сможете прочитать эти свойства, используя график API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top