Пример #1
0
    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)