3

拡張パラメータ スコープに「email」を含めました。竜巻オブジェクトでメールを読むにはどうすればよいですか?

私の LoginHandler は次のようになります。

class LoginHandler(tornado.web.RequestHandler, tornado.auth.FacebookGraphMixin):
    @tornado.web.asynchronous
    def get(self):
        userID = self.get_secure_cookie('user_id')

        if self.get_argument('code', None):
            self.get_authenticated_user(
                redirect_uri='http://localhost:8000/auth/login',
                client_id=self.settings['facebook_api_key'],
                client_secret=self.settings['facebook_secret'],
                code=self.get_argument('code'),
                callback=self.async_callback(self._on_facebook_login))

            return
        elif self.get_secure_cookie('access_token'):
            self.redirect('/')
            return

        self.authorize_redirect(
            redirect_uri='http://localhost:8000/auth/login',
            client_id=self.settings['facebook_api_key'],
            extra_params={'scope': 'email'}
        )

    def _on_facebook_login(self, user):
        if not user:
            self.clear_all_cookies()
            raise tornado.web.HTTPError(500, 'Facebook authentication failed')

        self.set_secure_cookie('user_id', str(user['id']))
        self.set_secure_cookie('user_name', str(user['name']))
        self.set_secure_cookie('access_token', str(user['access_token']))
        self.redirect('/')

電子メールをオブジェクトに収集し、データベースに挿入する必要があります。

4

1 に答える 1

2

私は文字通り、ほんの数日前に同じ問題を抱えていました。Facebook のドキュメントは、API の使用にはあまり役立ちません。あなたは周りを掘る必要があります。

Anw、解決策は facebook_request() を作成し、ユーザー プロファイルを取得することです。そのユーザー プロファイルで、ユーザーの電子メールを見つけることができます。リクエストをログイン コールバックに入れます。

リクエストは次のようになります。

self.facebook_request("/me", access_token=user["access_token"], callback=self._save_user_profile)

_on_facebook_login() コールバックで返された「user」オブジェクトからユーザー トークンにアクセスします。ここで、_save_user_profile() という別のコールバックを定義します。

def _save_user_profile(self, user):
        if not user:
            raise tornado.web.HTTPError(500, "Facebook authentication failed.")
        try:
            User.objects(email=user['email']).get()
        except DoesNotExist, e:            
            new_u = User()
            new_u.first_name = user['first_name']
            new_u.last_name = user['last_name']
            new_u.email = user['email'] #THIS IS WHAT YOU NEED
            new_u.username = user['username']
            new_u.gender = user['gender']
            new_u.locale = user['locale']
            new_u.fb_id = user['id']
            new_u.save()    
        else:
            #User exists
            pass 
于 2012-07-09T10:24:24.103 に答える