Skip to content

Commit

Permalink
Catch Invalid Token error when using API and re-auth appropriately.
Browse files Browse the repository at this point in the history
  • Loading branch information
woodcoder committed Jul 20, 2010
1 parent dd3d447 commit f64b7c4
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 29 deletions.
2 changes: 1 addition & 1 deletion facebook/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def urlread(url, data=None):

__all__ = ['Facebook','create_hmac']

VERSION = '1.0a1'
VERSION = '1.0a2'

FACEBOOK_URL = 'http://api.facebook.com/restserver.php'
FACEBOOK_VIDEO_URL = 'http://api-video.facebook.com/restserver.php'
Expand Down
71 changes: 44 additions & 27 deletions facebook/djangofb/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,33 +194,31 @@ def decorator(view):
def newview(request, *args, **kwargs):
# permissions=newview.permissions

fb = _check_middleware(request)

valid_token = fb.oauth2_check_session(request)

if required_permissions:
has_permissions = fb.oauth2_check_permissions(
request, required_permissions, check_permissions,
valid_token, force_check)
else:
has_permissions = True

if not valid_token or not has_permissions:
redirect_uri = fb.url_for(_redirect_path(redirect_path, fb, request.path))

if keep_state:
if callable(keep_state):
state = keep_state(request)
else:
state = request.get_full_path()
# passing state directly to facebook oauth endpoint doesn't work
redirect_uri += '?state=%s' % urlquote(state)

return fb.redirect(
fb.get_login_url(next=redirect_uri,
required_permissions=required_permissions))

return view(request, *args, **kwargs)
try:
fb = _check_middleware(request)

valid_token = fb.oauth2_check_session(request)

if required_permissions:
has_permissions = fb.oauth2_check_permissions(
request, required_permissions, check_permissions,
valid_token, force_check)
else:
has_permissions = True

if not valid_token or not has_permissions:
return _redirect_login(request, fb, redirect_path,
keep_state, required_permissions)

return view(request, *args, **kwargs)
except facebook.FacebookError as e:
# Invalid token (I think this can happen if the user logs out)
# Unfortunately we don't find this out until we use the api
if e.code == 190:
del request.session['oauth2_token']
del request.session['oauth2_token_expires']
return _redirect_login(request, fb, redirect_path,
keep_state, required_permissions)
# newview.permissions = permissions
return newview
return decorator
Expand All @@ -239,6 +237,25 @@ def _redirect_path(redirect_path, fb, path):
redirect_path = path
return redirect_path

def _redirect_login(request, fb, redirect_path, keep_state, required_permissions):
"""
Fully resolve the redirect path for an oauth login and add in any state
info required to bring us back to the correct place afterwards
"""
redirect_uri = fb.url_for(_redirect_path(redirect_path, fb, request.path))

if keep_state:
if callable(keep_state):
state = keep_state(request)
else:
state = request.get_full_path()
# passing state directly to facebook oauth endpoint doesn't work
redirect_uri += '?state=%s' % urlquote(state)

return fb.redirect(
fb.get_login_url(next=redirect_uri,
required_permissions=required_permissions))


def process_oauth(restore_state=True):
"""
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from setuptools import setup, find_packages

setup(name='pyfacebook',
version='1.0a1',
version='1.0a2',
description='Python Client Library for the Facebook API',
author='Samuel Cormier-Iijima',
author_email='sciyoshi@gmail.com',
Expand Down

0 comments on commit f64b7c4

Please sign in to comment.