Gestión de sesiones en Google App Engine con Android / IPhone

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 a la API Web utilizando JSON.

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

¿Puede alguien ayudar con algunos ejemplos de código / sugerencias de cómo lograr el siguiente por favor?

Método

  1. La aplicación móvil llama a un método de inicio de sesión en el servidor que autentica y crea una clave de sesión en el almacén y lo devuelve a la aplicación. No está seguro de cómo generar la clave / sesión o en qué lugar de la solicitud / respuesta debe estar.
  2. En cada llamada, la aplicación pasa esta clave para que el servidor se autentique y permite la acción si se pasa.
  3. El usuario no debería tener que iniciar sesión en el móvil de nuevo a menos que se desconecten explícitamente o pierdan la clave.

Método de acceso – 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)) 

Creo que deberías usar las características de webapp2 para implementar tu 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 eg 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 el usuario conectado por:

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

En su aplicación cliente (Android, IOS). Sólo tiene que almacenar la cookie de respuesta y enviarla para cada solicitud de secuencia secundaria.

Buena suerte 🙂

Echa un vistazo a webapp2 y extras webapp2 con sesiones, auth y JSON

No veo por qué necesitaría una sesión? Las sesiones en App Engine se mantienen en el almacén de datos, así que si puede mantener sus peticiones sin estado, le animo a hacerlo.

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

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

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

  1. Obtenga un ID de dispositivo / correo electrónico único para identificar cada usuario único.
  2. A petición de un usuario específico, genere una clave de autenticación aleatoria y guárdela adjunta al correo electrónico / ID de dispositivo del usuario y probablemente a la marca de tiempo actual ya un indicador registrado.

Así que tienes:

 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 inicia sesión:

  • Compruebe la combinación de contraseña y correo electrónico.
  • Si es válido, genere una clave aleatoria y actualice el almacén de datos con la nueva clave
  • actualizar timestamp con la hora actual y establecer loggedIn a True
  • Ahora devuelva la clave al cliente (Android / iPhone) en un objeto JSON.

Ahora en cada petición, compruebe la llave recibida contra la que está en su almacén de datos , y si la bandera loggedIn está fijada a verdad. Si ambos están bien, procese la solicitud.

También, en Logout:

  • Simplemente establezca el indicador loggedIn en el almacén de datos en False.

Espero que esto ayude 🙂

Intente gae-sesiones para la gerencia de la sesión. Crea cookies seguras para ti y te permite asociar fácilmente datos con cada usuario. Sólo proporcione su propia lógica para la autenticación inicial.

Fue construido específicamente para App Engine y es bastante popular y super rápido / escalable.

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

Hay muchas maneras de hacer esto.

1) Cuando comprueba los detalles de inicio de sesión de los usuarios si se comprueba, puede crear un UUID o cadena aleatorio y almacenar el objeto Usuario en memcache con la cadena aleatoria como la clave y el objeto de usuario como valor. A continuación, devuelve la cadena aleatoria junto con los encabezados de respuesta. En el móvil cuando se está analizando la respuesta, obtenga este encabezado y guárdelo en la memoria caché local. En todas las demás solicitudes seguir enviando esta clave de nuevo en el encabezado de la solicitud y en su controlador obtener el objeto de usuario de memcache con esta tecla y proceder. Si el objeto no está en memcache, puede enviar una respuesta que le pida al usuario que inicie sesión.

2) Si no desea utilizar memcache puede almacenar el objeto de usuario en la sesión y en el lado del cliente mientras analiza la respuesta obtener el id de sesión de la respuesta. Su generalmente JSESSIONID. Luego guárdelo y vuelva a enviarlo con otras solicitudes. En el controlador puede comprobar si la sesión actual tiene el objeto de usuario, o bien forzar el inicio de sesión.

1) Otra manera de ir sería devolver la clave appengine para el usuario junto con la respuesta y volver a enviarla.

Sólo google obtener respuesta cabecera de respuesta. A continuación, obtenga el encabezado SESSIONID / JSESSIONID, guarde y agregue el campo con el mismo nombre y valor a todos los encabezados de solicitudes adicionales. Esa es la manera más fácil.

Mi primera respuesta sobre stackoverflow y no exapmles de código, dangit si sólo conocía python.

  • Alcance de acceso utilizando el nombre de tipo en Google Cloud / Android Mobile Backend Starter
  • Error al ejecutar el cliente de back-end móvil del motor de aplicaciones de Google
  • Plugin de Google no funciona para el proyecto de App Engine - Eclipse Indigo - WindowsXP
  • GCM, Android, iOS, utilizando la misma ID de remitente y clave de servidor / clave de autorización
  • Ubicación personalizada del almacén de datos en una máquina local con App Engine
  • Variedad de errores en la aplicación Mobile Backend Starter Sample
  • ¿Cómo usar los puntos finales de Google Cloud con Volley?
  • GAE no reconoce la cookie?
  • GoogleJsonResponseException: 404 No se encuentra utilizando el motor de punto final de google apps backend
  • Google OAuth2 - token de acceso y token de actualización -> invalid_grant / Code ya se redimió
  • Problemas al ejecutar aplicaciones desplegadas en Google AppEngine
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.