2011-07-15 37 views
8

La forma en que puedo autenticar a mis usuarios en App Engine usando Cuentas de Google es simplemente maravillosa.Google App Engine: autenticación personalizada

Sin embargo, necesito usar mi sistema personalizado de autenticación de inicio de sesión.

Voy a tener una tabla de AppUsers, con nombres de usuario y contraseñas encriptadas.

Leí algo sobre las sesiones en gae, pero necesito ayuda para iniciar la seguridad de mi aplicación.

¿Cómo puedo rastrear mi sesión de usuario autenticado? Establecer una cookie?

Un principiante.

+0

Probablemente debería añadir una etiqueta para los que el tiempo de ejecución que está utilizando (Python/Java) para tirar de la gente correcta. Eche un vistazo a los marcos que pueden ayudarlo con el aspecto de la sesión. –

+0

Existen bibliotecas de sesión para App Engine. ¿De qué tiene dudas? –

Respuesta

6

Puede usar cookies para hacerlo ... Realmente no es tan difícil. Puede usar cookies para rastrear el usuario autenticado y almacenar la clave de sesión en gae datastore.

Hay un ejemplo (Se acaba de mostrar la idea básica, no garantizo el código se puede utilizar directamente)

la tabla de usuario básica:

# simply add an property to store the session key 
class User(db.Model):  
    username = db.StringProperty() 
    password = db.StringProperty() 
    session = db.StringProperty() 

La función de sesión

# Do the following step: 
# 1. make sure user provide correct username and password 
# 2. generate a random session key 
# 3. store the session key to datastore 
# 4. set the session key and user name in cookie 
class LoginAPI(Webapp.RequestHandler): 
    def get(self): 
     username = self.getVar('username', username) 
     password = self.getVar('password', password) 

     user = User.all().filter("username = ", username).get() 
     password = encrypted_the_password(password) # encrypted your password with your own method! 

     if user.password == password: 
      # User login successfually 
      session = generate_random_session_key() # generate your session key here 
      user.session = session 
      user.put() 

      expires_time = decide_your_expires_time() # decide how long the login session is alive. 
      cookie_time_format = "%a, %d-%b-%Y %H:%M:%S GMT" 
      expires_datetime = datetime.datetime.fromtimestamp(expires_time) 

      # set cookie as session 
      self.response.headers.add_header("Set-Cookie", "user=%s; expires=%s; path=/" % (user.username,expires_datetime.strftime(cookie_time_format))) 
      self.response.headers.add_header("Set-Cookie", "session=%s; expires=%s; path=/" % (user.session, expires_datetime.strftime(cookie_time_format))) 
     else: 
      #User login failed 
      pass 

La función de cierre de sesión

# Remove the previous cookie info 
class LoginAPI(Webapp.RequestHandler): 
     def get(self): 
      # remove the cookie 
      self.response.headers.add_header("Set-Cookie", "user=%s; expires=%s; path=/" % ("",expires_datetime.strftime(cookie_time_format))) 
      self.response.headers.add_header("Set-Cookie", "session=%s; expires=%s; path=/" % ("", expires_datetime.strftime(cookie_time_format))) 

Cuando se requiere la conexión del usuario

# Get the session info from cookie. If the session info match the info stored in datastore 
# Then user authenticate successfully. 
class SomePage(Webapp.RequestHandler): 
    def get(self): 
     # get cookie info 
     username_from_cookie = self.request.cookies.get("user", "") 
     session_from_cookie = self.request.cookies.get("session", "") 

     if username_from_cookie and session_from_cookie: 
      user = User.all().filter("username = ", username_from_cookie).get() 
      if user.session == session_from_cookie: 
       # the user is login correctly 
       pass 
      else: 
       # the user is not login 
       pass 
     else: 
      # the user is not login 
      pass 
+1

Realmente no hay necesidad de reinventar la rueda; hay bibliotecas de sesión que hacen esto por usted. –

+1

¿Podría proporcionar más detalles sobre las bibliotecas de sesión para GAE? – lucemia

+1

quoto. Buena respuesta ... sin embargo, no mencioné que usaré JAVA. :) –