python - import webapp2
Autenticación de Google Cloud Endpoints con sesiones de webapp2 (1)
El cliente de mi API de Google Cloud Endpoints es una aplicación web de JavaScript (AngularJS) alojada en la misma aplicación de Google App Engine que la API de Endpoints. Mis usuarios se autentican usando sesiones de webapp2 (almacén de datos). No necesariamente tienen una cuenta de Google. Deseo poder hacer una solicitud a la API de /api/users/me
como /api/users/me
que devolvería los datos de usuario del usuario que está actualmente conectado.
Primero pensé que tenía que implementar un proveedor OAuth2 para mi aplicación App Engine y luego dejar que la aplicación AngularJS solicitara un token de acceso OAuth2 de mi propio proveedor OAuth de App Engine (en lugar del proveedor OAuth de Google, como hace el mecanismo de autenticación integrado) )
Sin embargo, este comentario sugiere no implementar mi propio proveedor de OAuth2, sino proporcionar parámetros arbitrarios en mi solicitud (en un campo de mensaje o en un encabezado HTTP) a la API de puntos finales. Supongo que ese parámetro debería ser un token de usuario (¿algún valor cifrado exclusivo para el usuario que inició sesión?). Ese valor debe pasar al navegador. ¿No es eso inseguro? Me gustaría no servir mi aplicación AngularJS en HTTPS si es posible (para ahorrar costos).
¿Es este un buen caso de uso para OAuth2? ¿O es OAuth2 solo para otorgar acceso a aplicaciones de terceros a datos de usuarios?
En caso de que OAuth2 no sea el camino a seguir: ¿cómo pasar un token de usuario de forma segura al navegador y evitar los ataques de hombre en el medio? ¿Debería caducar el token de usuario después de un cierto período de tiempo?
Acabo de terminar de implementar exactamente lo que describiste. Básicamente, este método hace el truco:
def get_current_session(request_state):
cookies = werkzeug.http.parse_cookie(request_state.headers.get(''Cookie''))
sess_cookie = cookies.get(''mc_session'')
parts = sess_cookie.split(''|'')
if len(parts) != 3:
logging.error(''Cookie does not have 3 parts'')
return False
signature = hmac.new(COOKIE_SECRET_KEY, digestmod=hashlib.sha1)
signature.update(''|''.join(parts))
sig_hex = signature.hexdigest()
if compare_hashes(sig_hex, parts[2]):
logging.error(''Cookie signature mismatch!'')
return False
cookie_data = webapp2_extras.json.b64decode(parts[0])
return sessions_ndb.Session.get_by_sid(cookie_data[''_sid''])
Y llamarías eso desde tu método API usando:
session = get_current_session(self.request_state)
Puede encontrar todos los detalles en: https://blog.artooro.com/2014/08/21/share-sessions-between-google-cloud-endpoints-and-webapp2/