2012-06-24 16 views
15

Estoy empezando a escribir una aplicación mediante la cual una aplicación móvil (Android/iPhone) se comunicará con el backend GAE (Python) a través de una serie de llamadas Web API utilizando JSON.Manejo de sesiones en Google App Engine con Android/iPhone

No puedo usar las cuentas de Google para la autenticación, así que tengo que implementar mi propia autenticación. Tengo una idea de cómo hacer esto, pero no estoy seguro de si hay una mejor manera.

¿Alguien puede ayudar con algunos ejemplos de código/sugerencias de cómo lograr lo siguiente, por favor?

Método

  1. aplicación móvil llama a un método de sesión en el servidor que autentica y crea una clave de sesión en la tienda y devuelve esto a la aplicación - no está seguro de cómo generar la clave/sesión o dónde en la solicitud/respuesta debería ser.
  2. En cada llamada, la aplicación pasa esta clave para que el servidor se autentique y permite la acción si pasa.
  3. El usuario no debería tener que volver a iniciar sesión en el dispositivo móvil a menos que cierre sesión o pierda la clave explícitamente.

Login Método - sin generación de claves

class Login(webapp.RequestHandler): 
def post(self): 
    args = json.loads(self.request.body) 
    email = args['e'] 
    pwd = args['p'] 
    ret = {} 
    user = User.gql('WHERE email = :1', email).get() 
    if user and helpers.check_password(pwd, user.password): 
     ret['ret_code'] = 0 
     ret['dn'] = user.display_name 
    else: 
     ret['ret_code'] = 1 

    self.response.headers['Content-Type'] = 'application/json' 
    self.response.out.write(json.dumps(ret)) 
+0

¿Está buscando a OAuth? parece bastante estándar para este tipo de cosas. –

Respuesta

0

Para consultar todas webapp2 y webapp2 extras con sesiones de autenticación y JSON

1

Creo que debería utilizar las funciones webapp2 proporcionan para implementar su registro personalizado

from webapp2_extras import auth 
from google.appengine.api import users 

class RegisterHandler(webapp2.RequestHandler): 
    def post(self): 
     email=self.request.POST['email'] 
     password=self.request.POST['password'] 

     #Let webapp2 handle register and manage session 
     user = auth.get_auth().store.user_model.create_user('own:'+str(email), password_raw=password,email=email) 
     #user (True, User(key=Key('User', 80001), auth_ids=[u'own:[email protected]'],email='[email protected]',password=u'hashed_password',...)) 

     if not user[0]: #user is a tuple 
      self.response.write(user[1]) # Error message 
     else: 
      #You can extend your User Model e.g UserProfile(User): or have a UserProperty in your profile model as the example. 
      profile=UserProfile(user=users.User(user[1].email)).put() 

      self.response.write(str(profile.key())) 
class LoginHandler(webapp2.RequestHandler): 

    def post(self): 

     email = self.request.POST.get('email') 
     email = self.request.POST.get('password') 
     # Try to login user with password 
     # Raises InvalidAuthIdError if user is not found 
     # Raises InvalidPasswordError if provided password doesn't match with specified user 
     try: 
      auth.get_auth().get_user_by_password('own:'+email, password) 
      #Return user_session with User id, 
     except InvalidPasswordError, InvalidAuthIdError: 
      #Error 

Puede comprobar Usuario conectado por:

if auth.get_user_by_session(): 
    #Logged in  
else: 
    #Not logged in 

En la aplicación cliente (Android, IOS). Solo debe almacenar la cookie de respuesta y enviarla para cada solicitud de secuencia secundaria.

Buena suerte :)

0

no puedo ver por qué se necesita una sesión? Las sesiones en App Engine se conservan en el almacén de datos, por lo que si puede mantener sus solicitudes sin estado, lo animo a que lo haga.

Como tendrá su propio servicio de usuario que autenticará a los usuarios, le sugiero que utilice autenticación implícita, ya que el secreto nunca se incluye en la solicitud.

Existen bibliotecas que implementan Digest para la mayoría de las plataformas de cliente y servidor.

0

Si no desea utilizar explícitamente Sesiones, etc., simplemente puede usar el Almacén de datos. Intente seguir esto:

  1. Obtenga un ID de dispositivo/correo electrónico único para identificar a cada usuario único.
  2. A petición de un usuario específico, genere una clave de autenticación aleatoria y almacénela adjunta a la dirección de correo electrónico/ID de dispositivo del usuario y, probablemente, a la marca de tiempo actual y a la marca loggedIn.

por lo que tiene:

User email/id: [email protected] 
password: xxxxxxxxxx 
Key : 2131231312313123123213 
Timestamp: 20:00 12-02-2013 
loggedIn : boolean value 

Esto puede ser modelo de base de datos. Ahora cada vez que el usuario inicie sesión:

  • Comprobar de correo electrónico, la combinación de contraseña.
  • Si es válida, generan al azar clave, y actualización del almacén de datos con la nueva clave
  • actualización de fecha y hora con la hora actual y establezca loggedin a verdadera
  • Ahora vuelva de nuevo la llave al cliente (Android/iPhone) en un objeto JSON.

Ahora en cada petición, compruebe la clave recibida contra el de su almacén de datos, y si loggedin indicador se establece en true. Si ambos están bien, procesa la solicitud.

Además, al cerrar la sesión:

  • acaba de establecer la banderaloggedin en el almacén de datos a Falso.

Espero que esto ayude :)

0

Trate gae-sessions para la gestión de sesiones. Crea cookies seguras para usted y le permite asociar datos fácilmente con cada usuario. Solo proporcione su propia lógica para la autenticación inicial.

Fue creado específicamente para App Engine y es bastante popular y superrápido/escalable.

https://github.com/dound/gae-sessions

0

Hay muchas maneras de hacer esto.

1) Cuando comprueba los datos de inicio de sesión de los usuarios, puede crear un UUID o una cadena aleatoria y almacenar el objeto Usuario en Memcache con la cadena aleatoria como clave y el Objeto de usuario como valor. A continuación, devuelve la secuencia aleatoria junto con los encabezados de respuesta. En el dispositivo móvil cuando está analizando la respuesta, obtenga este encabezado y guárdelo en la memoria caché local. En todas las demás solicitudes, siga enviando esta clave nuevamente al encabezado de solicitud y en su controlador obtenga el objeto Usuario de Memcache con esta clave y proceda. Si el objeto no está en Memcache, puede enviar una respuesta que solicita al usuario iniciar sesión.

2) Si no desea usar Memcache, puede almacenar el objeto Usuario en la sesión y en el lado del cliente mientras analiza la respuesta obtiene la identificación de la sesión de la respuesta. Generalmente es JSESSIONID. Luego, almacénelo y vuelva a enviarlo con otras solicitudes. En el controlador puede verificar si la sesión actual tiene el objeto de usuario else forzar el inicio de sesión.

1) Otra forma de hacerlo sería devolver la clave de apéndice para el usuario junto con la respuesta y volver a enviarla.

Solo google obtener encabezado de respuesta de la respuesta. A continuación, obtenga el encabezado SESSIONID/JSESSIONID, almacene y agregue el campo con el mismo nombre y valor a todos los demás encabezados de solicitud. Esa es la forma más fácil.

Mi primera respuesta en stackoverflow y sin código exapmles, dangit si solo conociera python.