def get(self): code = self.request.GET.get('code') logging.debug("Auth Code: %s" % code) logging.debug("Session (at start): %s" % self.session) if None == code: # TODO Display cancelled login page issue#27 return self.response.write('No authentication code returned') try: flow = google_api.oauth2_flow() auth = flow.step2_exchange(code) now = datetime.now() # Get Google user info google_user = google_api.user_info(auth.to_json()) # Attempt to fetch user record from DB with matching google_id user = User.get_by_google_id(google_user.get('id')) # Create user if none exists if user == None: profile_slug = slug.create(google_user['email'].split('@')[0]) user = User( google_id = google_user.get('id'), profile_name = google_user.get('name'), profile_slug = profile_slug, created_at = now, modified_at = now, last_login_at = now) # We expect a refresh token, so store it issue#22 user.credentials = auth.to_json() # TODO The following may be causing occasional invalid grant errors issue#22 # logging.debug("User Refresh Token: %s" % user.refresh_token()) # # Do nothing if we have a refresh token # if user.refresh_token(): # logging.debug("User has existing Refresh Token") # pass # # Store refresh token if we can # elif None == user.refresh_token() and auth.refresh_token: # logging.debug("Storing Refresh Token for User") # user.credentials = auth.to_json() # # Go get a refresh token if we need one # else: # logging.debug("Fetching Refresh Token") # logging.debug("Redirect to: /auth/login?approval_prompt") # return self.redirect('/auth/login?approval_prompt') # Update user account # https://github.com/opendatapress/open_data_press/issues/5#issuecomment-23477495 user.google_birthday = google_user.get('birthday') user.google_email = google_user.get('email') user.google_gender = google_user.get('gender') user.google_locale = google_user.get('locale') user.google_name = google_user.get('name') user.google_picture_url = google_user.get('picture', '/img/default_avatar_%s.png' % random.randrange(1,8)) user.last_login_at = now user.put() # Create session logging.debug("Creating session for user: %s" % user.google_id) self.current_user(user) # Redirect to provided url if set if 'redirect_url' in self.session.keys(): url = str(self.session['redirect_url']) del self.session['redirect_url'] return self.redirect(url) # Redirect to dashboard instead logging.debug("Session (at end): %s" % self.session) logging.debug("Redirect to: /dashboard") self.redirect('/dashboard') except Exception as e: error_500(self.request, self.response, e)