I finally managed to create the OAuth2CallbackHandler to fit the scenario I already specified in my post. Here is the solution for people having the same issue.
class OAuth2CallbackRequestHandler(webapp2.RequestHandler):
@decorator.oauth_aware
def get(self):
user = users.get_current_user()
if not user: #user not signed in
return self.redirect(users.create_login_url(self.request.url))
else: #user signed-in
usrs = UsersModel.query(UsersModel.email == users.get_current_user().email()).fetch()
if len(usrs) == 0: #NEW USER
if len(self.request.get('code')) != 0: #user gave us permission
credentials = decorator.flow.step2_exchange(self.request.get('code')) #exchange user-permissions for credentials
decorator.set_credentials(credentials)
if decorator.has_credentials(): #ensuring credentials are setup
http = decorator.http()
myService = build('plus', 'v1', developerKey = api_key, http = http)
user = UsersModel(email = users.get_current_user().email())
people_resource = myService.people()
people_document = people_resource.get(userId='me').execute()
user.gplus_profile_url = people_document['url']
user.gplus_avatar_url = people_document['image']['url']
user.display_name = people_document['displayName']
user.access_token = credentials.access_token
user.refresh_token = credentials.refresh_token #You may need them if you want to update the current information
user.put()
return self.redirect('/MyPage')
else:
return self.redirect('/oauth2callback')
else: #we ask user for permission
link = decorator.authorize_url()
return self.redirect(link)
else: #USER ALREADY EXISTS
return self.redirect('/MyPage')
class MyPage(webapp2.RequestHandler):
def get(self):
if not users.get_current_user():
self.redirect('/oauth2callback')
return
# Continue your work here