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.
- ¿Tengo que usar CollectionResponse como un tipo de retorno en GAE Endpoints API o puedo usar colecciones java de entidades?
- Notificación Push mediante Firebase y Google Cloud Messaging
- El nombre de GoogleAccountCredential es nulo a pesar de llamar a setSelectedAccountName (Android 6.0)
- Pruebas locales para la aplicación de Android que utilizan puntos finales de Cloud para Google App Engine
- GCM y App Engine para aplicaciones de chat
¿Puede alguien ayudar con algunos ejemplos de código / sugerencias de cómo lograr el siguiente por favor?
Método
- 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.
- En cada llamada, la aplicación pasa esta clave para que el servidor se autentique y permite la acción si se pasa.
- 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))
- Suscripciones a la búsqueda prospectiva de Google App Engine Cuota excedida
- Google Cloud Messaging para Android Library no se encuentra en el administrador de sdk
- Cómo integrar la autenticación firebase con los puntos finales del motor de aplicaciones de Google
- Necesito sugerencias para enviar notificaciones push
- No se puede conectar a los puntos finales gae locales del emulador de Genymotion
- No se ha establecido la raíz SDK de App Engine. Asegúrese de establecer la variable de entorno 'APPENGINE_HOME' propiedad del sistema 'appengine.sdk.root'!
- "No se pudo inicializar el SDK de App Engine en (ruta de acceso)" en eclipse 4.2.2 con Mac OSX León de montaña
- ¿Cómo enviar datos desde dispositivos móviles Android al almacén de datos de Google App Engine?
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:
- Obtenga un ID de dispositivo / correo electrónico único para identificar cada usuario único.
- 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.
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.
- ¿Cómo puedo ver un video dentro de un videoview en una posición específica?
- Cambiar el texto de SearchView y el color de la sugerencia de appcompat