即使应用程序似乎与FB登录api一起工作,Tornado应用程序抛出异常

时间:2014-01-28 17:52:20

标签: python facebook facebook-graph-api python-2.7 tornado

我正在开发一个简单的龙卷风应用程序,我在其中使用FB身份验证进行用户登录,我需要与该用户关联的该用户的电子邮件ID。

以下是我的FB登录处理程序,首先它获取访问令牌并再次使用该访问令牌,它会调用FB来发送电子邮件。

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

          if self.get_argument('code', None):
              self.get_authenticated_user(
                  redirect_uri=settings.redirect_url,
                  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('/')

          self.authorize_redirect(
              redirect_uri=settings.redirect_url,
              client_id=self.settings['facebook_api_key'],
              extra_params={'scope': 'email'}
          )


      def _on_facebook_login(self, user):
          def _save_user_profile(user):
              if not user:
                  raise tornado.web.HTTPError(500, "Facebook authentication failed.")
              # print user
              # print user.get('email')

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

          # does user['id'] already exists in DB? if not, add request for 
          # email from FB, insert both id and email

          self.facebook_request("/me", access_token=user["access_token"], callback=_save_user_profile)
          self.set_secure_cookie('trakr', str(user['id']))
          self.set_secure_cookie('access_token', str(user['access_token']))
          self.redirect('/')

以下是我的完整错误日志:

[I 140128 20:52:09 autoreload:191] main.py modified; restarting server
[I 140128 20:52:15 web:1728] 304 GET / (::1) 0.58ms
[I 140128 20:52:23 web:1728] 302 GET /auth/flogin (::1) 0.99ms
[E 140128 20:52:23 web:1305] Uncaught exception GET /auth/flogin (::1)
    HTTPRequest(protocol='http', host='localhost:8757', method='GET', uri='/auth/flogin', version='HTTP/1.1', remote_ip='::1', headers={'Accept-Language': 'en-US,en;q=0.8', 'Accept-Encoding': 'gzip,deflate,sdch', 'Host': 'localhost:8757', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36', 'Connection': 'keep-alive', 'Cookie': 'access_token=Q0FBVHBjWUFHbFFVQkFGWkNQU0J5eDVFTWcwR2wyeFNNeXZHQlpCYUVxZkNzMGRSSzJjNEN6MHFDa0lWZnhmdzlFREp6SmlxOE1kN0loVm1zQVZ3d1RiT3pvSko1MFRsczYxdlVkaU1VS3Y2VHFFTXN3WEFpNzh0eTRtckxMaHgyNjVGejRKbGRkOGFVd3JWZjQ3WkJ6ZDk4ZEhRMWxVWkE0VVpBMVZnUThndjBNY00zSHJxWkNR|1390922478|305e1721c5138255a222432c83c2a4d6d330cb8d; trakr=NjE5MzU1ODA0|1390922478|7681ab19f6e2c43879c77a139c3de9d9daca493a; user_name="QXZpbmFzaCBTYWpqYW5zaGV0dHk=|1390922478|46211cd889f4037eef1c46e1767f185d0ca2656e"', 'Cache-Control': 'max-age=0'})
    Traceback (most recent call last):
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/web.py", line 1192, in _stack_context_handle_exception
        raise_exc_info((type, value, traceback))
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/web.py", line 1375, in wrapper
        result = method(self, *args, **kwargs)
      File "main.py", line 73, in get
        extra_params={'scope': 'email'}#'user_photos, publish_stream'}
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/concurrent.py", line 234, in wrapper
        raise_exc_info(exc_info)
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/concurrent.py", line 222, in wrapper
        result = f(*args, **kwargs)
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/auth.py", line 576, in authorize_redirect
        url_concat(self._OAUTH_AUTHORIZE_URL, args))
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/web.py", line 578, in redirect
        raise Exception("Cannot redirect after headers have been written")
    Exception: Cannot redirect after headers have been written
[I 140128 20:52:23 web:1728] 304 GET / (::1) 0.49ms
[I 140128 20:52:59 web:1728] 304 GET /auth/logout (::1) 1.45ms
[I 140128 20:53:02 web:1728] 302 GET /auth/flogin (::1) 0.65ms
[I 140128 20:53:02 web:1728] 302 GET /auth/flogin (::1) 0.61ms
[W 140128 20:53:04 auth:85] Facebook auth error: HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x10ed6e7d0>,code=400,effective_url='https://graph.facebook.com/oauth/access_token?client_secret=71f12beedbeca0c8b7f0b8f799a0b24d&code=AQCT93GoGYzZisnts1MkTWzpGGfdPu2nKgi5GIX0_vr2A6jtck0jdouPEFYUEEm_w086K-4XpHedcqZJ9djTCprH6xiMwnL39iLF5Mf3yM_1eJDJJgPzz6M7Pm9XauUmGZa2PJlEY37y6RKmri_IEi0FMev3tpTuhUdcDrkqZ2aMgECqKFGIU6xj5xWHvyipNtlJ_iK1rU-Ul90itjT7b9Mii5TXAflYZFqSya7QfEOrZZjylydX_akBrXZAxOzxmNDc6sIMpeC1FMO5G5lTMmcR3doaa9ex59IT1u7AhXk3C0qnF81YC_3fOO2GoWk7GPY&client_id=1382573595333893&redirect_uri=http%3A%2F%2Flocalhost%3A8757%2Fauth%2Fflogin',error=HTTPError('HTTP 400: Bad Request',),headers={'Content-Length': '97', 'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT', 'X-Fb-Debug': 'wqhG+tPsSx+eZZVWzBEwJz0LuKc70mSstadFOx2TKN0=', 'X-Fb-Rev': '1097933', 'Connection': 'close', 'Pragma': 'no-cache', 'Cache-Control': 'no-store', 'Date': 'Tue, 28 Jan 2014 15:23:04 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'text/javascript; charset=UTF-8', 'Www-Authenticate': 'OAuth "Facebook Platform" "invalid_code" "This authorization code has been used."'},reason='Bad Request',request=<tornado.httpclient.HTTPRequest object at 0x10e6bbd50>,request_time=1.221066951751709,time_info={})
[W 140128 20:53:04 web:1302] 500 GET /auth/flogin?code=AQCT93GoGYzZisnts1MkTWzpGGfdPu2nKgi5GIX0_vr2A6jtck0jdouPEFYUEEm_w086K-4XpHedcqZJ9djTCprH6xiMwnL39iLF5Mf3yM_1eJDJJgPzz6M7Pm9XauUmGZa2PJlEY37y6RKmri_IEi0FMev3tpTuhUdcDrkqZ2aMgECqKFGIU6xj5xWHvyipNtlJ_iK1rU-Ul90itjT7b9Mii5TXAflYZFqSya7QfEOrZZjylydX_akBrXZAxOzxmNDc6sIMpeC1FMO5G5lTMmcR3doaa9ex59IT1u7AhXk3C0qnF81YC_3fOO2GoWk7GPY (::1): Facebook authentication failed
[E 140128 20:53:04 web:1728] 500 GET /auth/flogin?code=AQCT93GoGYzZisnts1MkTWzpGGfdPu2nKgi5GIX0_vr2A6jtck0jdouPEFYUEEm_w086K-4XpHedcqZJ9djTCprH6xiMwnL39iLF5Mf3yM_1eJDJJgPzz6M7Pm9XauUmGZa2PJlEY37y6RKmri_IEi0FMev3tpTuhUdcDrkqZ2aMgECqKFGIU6xj5xWHvyipNtlJ_iK1rU-Ul90itjT7b9Mii5TXAflYZFqSya7QfEOrZZjylydX_akBrXZAxOzxmNDc6sIMpeC1FMO5G5lTMmcR3doaa9ex59IT1u7AhXk3C0qnF81YC_3fOO2GoWk7GPY (::1) 1223.15ms
[I 140128 20:53:05 web:1728] 302 GET /auth/flogin?code=AQDHHt-ajYsUK5lkqVtreZuL9d5p9xx5dgzpUejdRoQNszwTPxJe91cs4XtX70WQeaegdmuczaAuOQXhi6yraN8hnI_aHjWLDdKfXBgtwDllsnslXP5XdiUpstRXkC2KgiQEU_ZYb9YlQU0UvYKZZ6sQWt8_y58fK05Aln-i5pHSGG6NHUipk_beeSZEgR-hTIWfH-MSwE4EUL3AvRlmmo_egrpknmSD2KT5_4trkz_pWkBJRHFoZech-Qspyz5SGIjvyiUFxiHfcZ4iWWtSYSpF86JOrKH0tyxMGKDrDDq2JBhLqjIBkANFEX0V1lGj0ss (::1) 2457.34ms
{u'username': u'av...y', u'bio': u'I am uninteresting !', u'first_name': u'Av...h', u'last_name': u'S...y', u'verified': True, u'name': u'Av...y', u'locale': u'en_US', u'gender': u'male', u'email': u'avi...@gmail.com', u'link': u'https://www.facebook.com/avi...y', u'timezone': 5.5, u'updated_time': u'2013-10-08T08:40:52+0000', u'id': u'6...4'}
avi...n@gmail.com

第一个错误是'例外:标题写完后无法重定向',为什么会出现这样的错误?

其次,查看日志,它仍然能够获取我的电子邮件并打印它,但它会引发Facebook身份验证错误。它在标题'OAuth'中表示Facebook平台“”invalid_code“”此授权代码已被使用。“}},reason ='Bad Request',即使它能够获取并显示电子邮件。那有什么不对?

编辑:我刚刚退出,清除了所有Cookie并重新登录,现在我没有看到任何FB登录错误。我认为它主要是使用旧的访问密钥?不确定。

登录后,如果我再次发送get请求,我会收到“写入标题后无法重定向”错误。为什么这样的错误?注意它显示在控制台上,在浏览器上没有错误。即用户永远不会看到此错误。这是完整的日志:

[I 140128 23:33:14 web:1728] 304 GET /auth/logout (::1) 1.57ms
[I 140128 23:33:17 web:1728] 302 GET /auth/flogin (::1) 0.60ms
[I 140128 23:33:17 web:1728] 302 GET /auth/flogin (::1) 0.59ms
[I 140128 23:33:20 web:1728] 302 GET /auth/flogin?code=AQDIQxT3YoQmQlyzivz4FjSotn1SVVyQeJNNknu3P18--b9Gkq9n0ZFKDhLHD31M-MVD6O2CJACHl6TxMyRKweeL834BYzNyCXqe40QmZYhFPm_eluKWkqhxbEvl0c9bx0VOa5YMLAr1448M9hx2Re11NWALjDDwkeF-KKwZXbE26iYbTCAxKdRdk34CJaj1RqQQs3vGPBUAmpzvNHdXgWRpuELRsJftgijTWA1dw1pEN1KeE4MOgdvw6L73Yfo3v-OJI0AavHJh0TXBsp0z4to5R1Qr2h97oTEBH1RvGY559NnmJuiW7z0tSAiTGnL5lgo (::1) 2486.21ms
[I 140128 23:33:20 web:1728] 304 GET / (::1) 0.46ms
{u'username': u'av...y', u'bio': u'I am uninteresting !', u'first_name': u'Av...h', u'last_name': u'S...y', u'verified': True, u'name': u'Av...y', u'locale': u'en_US', u'gender': u'male', u'email': u'avi...@gmail.com', u'link': u'https://www.facebook.com/avi...y', u'timezone': 5.5, u'updated_time': u'2013-10-08T08:40:52+0000', u'id': u'6...4'}
avi...@gmail.com
[I 140128 23:33:26 web:1728] 302 GET /auth/flogin (::1) 0.92ms
[E 140128 23:33:26 web:1305] Uncaught exception GET /auth/flogin (::1)
    HTTPRequest(protocol='http', host='localhost:8757', method='GET', uri='/auth/flogin', version='HTTP/1.1', remote_ip='::1', headers={'Connection': 'keep-alive', 'Accept-Language': 'en-US,en;q=0.8', 'Accept-Encoding': 'gzip,deflate,sdch', 'Cookie': 'access_token="Q0FBVHBjWUFHbFFVQkFQQzNwdTh1aUJFdnZDb3NrRWpqN2pJQ0F5VFZrNW1aQWllWWFPaENiaERaQXMyRThaQzQ4c0V4UW1FN2F5YzVrcEZYcVJzSndxYnJzM3RxQU9hM2gyNlVlRWlvanNaQmFGbW1uY3VXcDF2NmNEaUVpNEJaQlEzdDhGc3pWTUVGNVFqR0Z4TGRzZ0ZIb1F1WkNVYkszdWRKNE12SnE0MWNXNFpCOEphNVJzMw==|1390932200|6dfe36f5d6f3909915fe3d3af8088a983dbb67be"; trakr=NjE5MzU1ODA0|1390932200|9298aab581e8db81e65334307f04ebfcd98f6e90; user_name="QXZpbmFzaCBTYWpqYW5zaGV0dHk=|1390932200|95fb3b517a773e7c98c8ef9cef9b627afcf79141"', 'Host': 'localhost:8757', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102 Safari/537.36'})
    Traceback (most recent call last):
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/web.py", line 1192, in _stack_context_handle_exception
        raise_exc_info((type, value, traceback))
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/web.py", line 1375, in wrapper
        result = method(self, *args, **kwargs)
      File "main.py", line 73, in get
        extra_params={'scope': 'email'}#'user_photos, publish_stream'}
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/concurrent.py", line 234, in wrapper
        raise_exc_info(exc_info)
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/concurrent.py", line 222, in wrapper
        result = f(*args, **kwargs)
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/auth.py", line 576, in authorize_redirect
        url_concat(self._OAUTH_AUTHORIZE_URL, args))
      File "/Users/avi/Documents/code/trakr/venv/lib/python2.7/site-packages/tornado/web.py", line 578, in redirect
        raise Exception("Cannot redirect after headers have been written")
    Exception: Cannot redirect after headers have been written
[I 140128 23:33:26 web:1728] 304 GET / (::1) 0.47ms

1 个答案:

答案 0 :(得分:1)

您需要在第一个self.redirect块中的elif之后返回;该错误是因为您尝试在同一请求中重定向两次(当它落到下面的authorize_redirect时)。