Простой пример управления пользователями для Google App Engine?

17

Я новичок в Google App Engine. В то время как я проходил учебное пособие, я обнаружил, что несколько вещей, которые мы делаем в php-mysql, недоступны в GAE. Например, в функции autoStore dataStore недоступна. Также меня смущает управление сеансом в GAE. Из-за всего меня смущает и не может визуализировать все это.

Пожалуйста, сообщите мне простую систему управления пользователями с регистрацией пользователя, входом пользователя, выходом пользователя, сеансом (создайте, управляйте, уничтожьте) с помощью хранилища данных. Также, пожалуйста, сообщите мне, где я могу получить простые, но эффективные примеры.

Спасибо заранее.     

задан fireball003 23.06.2009 в 03:58
источник

3 ответа

22

Я стараюсь использовать свой собственный пользовательский интерфейс и сеансовый интерфейс

Для моих веб-обработчиков я приложу декоратор под названием session и один из них называется authorize . Декодер session будет прикреплять сеанс к каждому запросу, а декоратор authorize будет удостовечен, что пользователь авторизован.

(Осторожно, авторский декоратор специфичен для того, как я разрабатываю свои приложения - имя пользователя является первым параметром в большинстве запросов).

Так, например, веб-обработчик может выглядеть так:

class UserProfile(webapp.RequestHandler):
  @session
  @authorize
  def get(self, user):
     # Do some funky stuff
     # The session is attached to the self object.
     someObjectAttachedToSession = self.SessionObj.SomeStuff
     self.response.out.write("hello %s" % user)

В приведенном выше коде декоратор session прикрепляет некоторые материалы сеанса, которые мне нужны, на основе файлов cookie, которые присутствуют в запросе. Заголовок authorize гарантирует, что пользователь сможет получить доступ к странице только в том случае, если сеанс является правильным.

Код декоратора ниже:

import functools
from model import Session
import logging

def authorize(redirectTo = "/"):
    def factory(method):
        'Ensures that when an auth cookie is presented to the request that is is valid'
        @functools.wraps(method)
        def wrapper(self, *args, **kwargs):

            #Get the session parameters
            auth_id = self.request.cookies.get('auth_id', '')
            session_id = self.request.cookies.get('session_id', '')

            #Check the db for the session
            session = Session.GetSession(session_id, auth_id)           

            if session is None:
                self.redirect(redirectTo)
                return
            else:
                if session.settings is None:
                    self.redirect(redirectTo)
                    return

                username = session.settings.key().name()

                if len(args) > 0:               
                    if username != args[0]:
                        # The user is allowed to view this page.
                        self.redirect(redirectTo)
                        return

            result = method(self, *args, **kwargs)

            return result
        return wrapper
    return factory

def session(method):
    'Ensures that the sessions object (if it exists) is attached to the request.'
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):

        #Get the session parameters
        auth_id = self.request.cookies.get('auth_id', '')
        session_id = self.request.cookies.get('session_id', '')

        #Check the db for the session
        session = Session.GetSession(session_id, auth_id)           

        if session is None:
            session = Session()
            session.session_id = Session.MakeId()
            session.auth_token = Session.MakeId()
            session.put()

        # Attach the session to the method
        self.SessionObj = session           

        #Call the handler.          
        result = method(self, *args, **kwargs)

        self.response.headers.add_header('Set-Cookie', 'auth_id=%s; path=/; HttpOnly' % str(session.auth_token))
        self.response.headers.add_header('Set-Cookie', 'session_id=%s; path=/; HttpOnly' % str(session.session_id))

        return result
    return wrapper

def redirect(method, redirect = "/user/"):
    'When a known user is logged in redirect them to their home page'
    @functools.wraps(method)
    def wrapper(self, *args, **kwargs):
        try:    
            if self.SessionObj is not None:
                if self.SessionObj.settings is not None:
                    # Check that the session is correct
                    username = self.SessionObj.settings.key().name()

                    self.redirect(redirect + username)
                    return
        except:
            pass
        return method(self, *args, **kwargs)
    return wrapper
    
ответ дан Kinlan 23.06.2009 в 17:33
  • Большое спасибо! Это имеет смысл. Однако я обеспокоен весь день, если мне придется интегрировать django только для собственного управления пользователями. Насколько я понимаю, webapp поддерживает только пользователей Google и всякую поддержку для этого. Любая помощь или совет по этому поводу? Могу ли я просто сделать это, не отправившись в Django? –  fireball003 23.06.2009 в 19:44
  • Вышеприведенный код не зависит от пользователей Google, поэтому вы теряете легкость разработки, но получаете больше контроля - ни одно из вышеперечисленных требований не требует Django ... - Все мое управление пользователями выполняется без API-интерфейса Googles User для twollo.com, ff.amplifeeder.com и т. д.). Я использую Django для рендеринга шаблонов на данный момент, поэтому для Django тоже не требуется. –  Kinlan 23.06.2009 в 22:50
  • - это все еще предпочтительный способ для управления пользователями пользователей? как реализован объект Session - Object, в частности функция MakeId ()? –  Martin Kapfhammer 25.01.2013 в 22:35
6

Django является ваш лучший выбор - с той версией, на которую я указал вам, auth и сеансы должны «просто работать» в соответствии с документами Django. эта статья дает простые инструкции и пример того, как исходить оттуда.

Для сеансов Django см. здесь ; для Django auth, здесь .

    
ответ дан Alex Martelli 23.06.2009 в 04:19
  • Хотя я использовал Django-on-AppEngine, я бы не стал игнорировать приложения, встроенные в auth over django. Какую причину вы делаете? (Да, я использую Django вне appengine тоже) –  ironfroggy 23.06.2009 в 04:24
  • «встроенный auth» GAE поддерживает только учетные записи Google и, в частности, не поддерживает «регистрацию пользователя», что очень важно для этого вопроса (поэтому я даже не стал предлагать OpenID на этот раз - последние несколько раз я спросили ли они это, по-видимому, как нападение на их желание разобраться с собственной регистрацией пользователей! -). –  Alex Martelli 23.06.2009 в 04:36
  • Пользователи могут зарегистрироваться в приложении специально при первом входе в систему со своими учетными данными Google (или OpenId). –  Nick Johnson 23.06.2009 в 13:57
1

Вы не пишете управление пользователями и регистрацию, и все это, потому что вы используете собственные службы аутентификации Google. Все это включено в документацию App Engine.

    
ответ дан ironfroggy 23.06.2009 в 04:22
  • Итак, мой пользователь должен использовать имя пользователя Google? Могут ли они зарегистрироваться только на моем сайте? Итак, что произойдет для регистрации пользователя? –  fireball003 23.06.2009 в 05:00