Google数据存储:除了将Google登录名添加到现有模型外,还添加用户注册

问题描述 投票:0回答:1

到目前为止,我一直在使用Google登录来创建帐户。现在,我想进行个人登录,其中用户提供电子邮件和密码进行注册。由于已经存在用户模型,因此我该如何使用他们输入的信息来连接到数据存储并创建用户。我对如何处理这个问题非常迷失。

注册用户的逻辑如下:

class NoahUserRegistrationSubmit(NoahSiteHandler):

    template_filename = 'registration_submit.html'

    def post(self):
        user_name = self.request.get('user_name')
        password = self.request.get('password')
        # password = self.request.form['password']
        self.render_template(values={'user_name':user_name, 'password':password})
        # return self.render_template(values={'user_name':user_name, 'password':password})


class NoahUserRegistration(NoahSiteHandler):

    template_filename = 'noah_registration.html'

    def get(self):
        self.render_template()

我正在使用的Google登录信息如下:

class GoogleSigninHandler(NoahSiteHandler):
    """ Google sign-in & register redirect """

    #@decorator.oauth_aware
    @decorator.oauth_required
    def get(self):
        try:
            user = None
            login = None
            is_new_account = False
            is_new_link = False


            http = decorator.http()
            google_user = plus_service.people().get(userId='me').execute(http=http)
            logging.info("user data: %s" % google_user)
            if google_user:
                google_id = google_user.get('id')
                displayName = google_user.get('displayName')
                email = None
                emails = google_user.get('emails', [])
                if len(emails) > 0:
                    email = emails[0].get('value')
                username = google_user.get('name', {}).get('givenName') or google_user.get('displayName')
                if email and not username:
                    username = email.split('@')[0]
                image_url = None
                image_data = google_user.get('image')
                if image_data:
                    is_default_image = image_data.get('isDefault', True)
                    if not is_default_image:
                        image_url = image_data.get('url')
                        if image_url:
                            image_url = image_url.replace('sz=50', 'sz=200')

                if google_id:
                    profile_key = 'https://www.google.com/profiles/%s' % google_id

                    login = NoahLogin.get_by_key_name(profile_key)
                    if login and login.user:
                        user = login.user
                        logging.info('logging existing user in')
                    else:
                        if not login:
                            logging.info('creating new login with key: %s' % profile_key)

                            is_new_link = True
                            login = NoahLogin(
                                        key_name=profile_key,
                                        provider='Google',
                                        email=email,
                                        preferredUsername=username,
                                        displayName=displayName,
                                        photo=image_url
                                    )

                        if self.session.has_key('me'):
                            user = NoahUser.smart_get(self.session['me'])
                            if user:
                                login.user = user
                                logging.info('adding google link to noahuser: %s based on session cookie' % login.user.nick)
                                login.put()

                        if not user:
                            #Search for legacy user based on email
                            logging.info('searching for legacy user with email %s', email)

                            #then by email
                            if email:
                                legacy_matches = NoahUser.all().filter('email =', email).fetch(1)
                                if len(legacy_matches) > 0:
                                    #legacy Google user
                                    logging.info('linking google accout to user with email: %s' % email)
                                    login.user = legacy_matches[0]
                                    user = login.user

                        if not user:
                            logging.info('creating new user account from google')

                            is_new_account = True
                            is_new_link = True
                            source = None
                            ua = self.request.headers['User-Agent']
                            if ua.find('Android') != -1:
                                source = 'android'
                            elif ua.find('Darwin') != -1:
                                source = 'iphone'
                            else:
                                source = 'web'

                            user = NoahUser(
                                        source=source,
                                        email=email,
                                        nick=unique_username_from(username or displayName)
                            )
                            user.put()

                        login.user = user
                        login.put()
                        taskqueue.add(url='/task/avatar/fetch', params = {'login': login.key()})

            if user and is_new_account:
                Event.new_user(user)
                user.deferred_update(source='new_account')
                sync_user_with_campaign_monitor(user)

            if user:
                self.session['me'] = str(user.key())
                self.request.registry['current_user'] = user

            if is_new_account:
                exit_url = self.url_for('index', new_account='1')
            elif is_new_link:
                exit_url = self.url_for('my_settings')
            else:
                exit_url = self.url_for('index')

            logging.info('redirecting to: %s' % exit_url)
            self.redirect(exit_url)

        except client.AccessTokenRefreshError:
          self.redirect(self.url_for('signin_google'))
google-app-engine google-cloud-platform google-cloud-datastore webapp2
1个回答
0
投票

正如评论所说,Firebase Auth适合您的情况。

[如果您真的想自己动手或无法使用Firebase Auth,则有User model taken from webapp2,您可以将其更改为从google.cloud.ndb.model.Expando继承(在python3.7 appengine运行时中)。

© www.soinside.com 2019 - 2024. All rights reserved.