def getCookieUserName(request): #Obtengo tipo de Cookie : local o OAuth idTipo=request.cookies.get('tipoLogin') #Obtengo valor Cookie idSesion=request.cookies.get('SessionId') #Inicializo nombreUsuario nombreUsuario=None if idTipo=="local": #Creo instancia del manjador de usuarios local UserHandler = UserManager() #Si la cookie ha caducado, me mostrara None como Usuario nombreUsuario = UserHandler.getCookieUserName(idSesion) elif idTipo=="oauth": #Creo instancia del manejador de usuarios OAuth OAuthHandler = OAuthUserManager() #Si la cookie ha caducado, me mostrara None como Usuario idUsuario = OAuthHandler.getCookieUserName(idSesion) nombreUsuario = OAuthHandler.getUserName(idUsuario) #DEBUG. Muesto info logging.debug("------getCookieUserName()----------") logging.debug("Tipo Sesion: " + str(idTipo)) logging.debug("SESION: " + str(idSesion)) logging.debug("Usuario: " + str(nombreUsuario)) logging.debug("--------------------------------") return nombreUsuario
def webLogout(): #Obtengo info de las cookies idSesion = request.cookies.get('SessionId') #tipo de login idTipo = request.cookies.get('tipoLogin') #OAUTH if idTipo == "oauth": #Creo instancia del manejador de usuarios OAuth OAuthHandler = OAuthUserManager() #Logout al usuario logging.info("(OAuth)logging out user: "******"local": logging.info("(Local)logging out user: " + idSesion) #Creo instancia del manejador de usuarios local UserHandler = UserManager() #Logout al usuario UserHandler.logout(idSesion) #Retornamos a la pag de login response = make_response(redirect(url_for('blueUser.webLogin'))) #Borramos datos cookies response.set_cookie('umbral', '', expires=0) return response
def webAccount(): #Obtengo info de usuario #Obtengo info de las cookies idSesion = request.cookies.get('SessionId') #tipo de login idTipo = request.cookies.get('tipoLogin') #Creo instancia del manejador de usuarios local UserHandler = UserManager() #Creo instancia del manejador de usuarios OAuth OAuthHandler = OAuthUserManager() #Incializamos vairables userid = None nombre = None email = None proveedor = None umbral = None #OAUTH if idTipo == "oauth": #Obtengo informacion Usuario OAuth userid = OAuthHandler.getCookieUserName(idSesion) nombre = OAuthHandler.getUserName(userid) email = OAuthHandler.getUserMail(userid) proveedor = OAuthHandler.getUserProvider(userid) umbral = OAuthHandler.getUmbral(userid) #LOCAL elif idTipo == "local": #Obtengo información Usuario Local userid = UserHandler.getCookieUserName(idSesion) nombre = userid umbral = UserHandler.getUmbral(nombre) #LLegados a este punto, si userid == None, una de dos: #o el usuario tiene cookie de sesion y le ha caducado, #o directamente no tiene cookie de sesion. #La forma de proceder en ambos casos es hacer que el #cliente inicie sesión en la aplicacion, por lo que #le redirigiremos a la pagina de login. if userid == None: #Creo respuesta response = make_response(redirect(url_for('blueUser.webLogin'))) #En caso contrario, obtenemos los datos y los devolvemos else: #Creo respuesta response = make_response(render_template("accountInfo.html",\ nombrehtml = nombre, emailhtml = email,\ proveedorhtml=proveedor, umbralhtml=umbral,\ tipoRegistrohtml = idTipo)) #Retorno la respuesta return response
def setLoginCookies(resp, cookieVal): if cookieVal >= 0: #Creo instancia del manejador de usuarios local UserHandler = UserManager() #Asigno cookies resp.set_cookie('SessionId', cookieVal) resp.set_cookie('tipoLogin', 'local') #también pongo umbral en la cookie, para notificaciones nombreUsuario = UserHandler.getCookieUserName(cookieVal) umbralUsuario = UserHandler.getUmbral(nombreUsuario) resp.set_cookie('umbral', str(umbralUsuario)) return resp
def webLogin(): if request.method == 'GET': #CLIENT_ID="324401899197-2cag1rbuoium6s2q96m1i0hm3fjium4g.apps.googleusercontent.com" CLIENT_ID = getClientId() return render_template("login.html", id_api=CLIENT_ID) elif request.method == 'POST': #Los convierto a string pues estrán en tipo 'unicode' user = str(request.form['user']) #user=request.args.get('user','default',type=str) passw = str(request.form['pass']) #passw=request.args.get('pass','default',type=str) #DEBUG logging.debug("DEBUG - /login") logging.debug("user - type: " + str(type(user))) logging.info("user: "******"pass - type: " + str(type(passw))) logging.info("pass: "******"url" : url_a_redireccionar, #"code": codigo del resultado de la operacion} datos = {'url': url, 'code': exito} logging.debug("RESPUESTA SERV: " + str(datos)) resp = make_response(jsonify(datos)) #--- #Añado cookies a la respuesta resp = setLoginCookies(resp, cookieVal) #return redirect(url_for('blueApp.webMain')) return resp
def __init__(self, coleccionUsuariosOauth="usuariosOauth", debug=False): #def __init__(self, coleccionUsuariosOauth): #Igual que el de el padre pero cambiando la coleccion empleada #UserManager.__init__(self,coleccionUsuariosOauth,debug) UserManager.__init__(self, coleccionUsuariosOauth, debug) #Añadimos los campos que no tenia el padre #En el dicc recibido, puede ser la entrada ['iss'] # The ID Token contains a set of claims about the authentication # session, including an identifier for the user (sub), the identifier # for the identity provider who issued the token (iss), and the # identifier of the client for which this token was created (aud). #Obtener el proveedor del campo 'iss' self.campoProveedor = "provider" self.campoEmail = "email" self.campoName = "name" # #SOBRESCRIBO el campo 'username' por el campo id, #ya que en mongo_user se empleaba este campo como #clave primaria y en esta clase empleare la id como #clave primaria, como si fuera el nombre de usuario. # #El campo campoUsername se emplea en funciones como #modUmbral para cambiar el umbral del usuario. Como esas #funciones no necesito cambiarlas, sobrescribiré el campo #de forma que se utilice el id para buscar el usuario y no #el username. self.campoUsername = "******" #Los campos que siguen igual son los de password (no se #utiliza) y el de umbral. # #Al ser diccionarios, las variables de la instancia #referenciarán a las de la clase, por lo que al modificar #las listas de la instancia realmente estaré modificando las #de la clase self.listaSesiones = OAuthUserManager.listaSesiones self.listaCaducidad = OAuthUserManager.listaCaducidad #debug self.debug = True
def webRegister(): logging.debug("/register - METODO: " + str(request.method)) #GET if request.method == 'GET': return render_template("register.html") #POST if request.method == 'POST': logging.debug("/register - Estoy en POST") username = str(request.form['username']) password = str(request.form['password']) umbral = float(request.form['umbral']) #Creo instancia del manejador de usuarios local UserHandler = UserManager() #Creacion usuario. Obtengo codigo indicando el resultado en 'exito'. exito = UserHandler.createUser(username, password, umbral) #url a la que redirigir al cliente si se registra al #usuario correctamente. url = url_for('blueUser.webLogin') #Datos a enviar al cliente en forma de JSON. #Deben tener el formato: #{"url" : url_a_redireccionar, #"code": codigo del resultado de la operacion} datos = {'url': url, 'code': exito} logging.debug("RESPUESTA SERV: " + str(datos)) #Creo la respuesta para el cliente. #Contendrá los datos en forma JSON response = make_response(jsonify(datos)) #Le envio info sobre el resultado de la operacion y #la pagina web a donde hay que redirigir en caso de #craecion satisfactoria. #Este mensaje es interpretado por el cliente mediante javascript, #de forma que si exito==0 redirige a url_for('webLogin') return response
def check_cookies(*args, **kwargs): #BLueprints #Importo dentro de esta funcion #para no crear un bucle de imports #Necesito blueUser para la redireccionar #a la página de /login -> webLogin #url_for('blueUser.webMain') #from blue_user import blueUser #from blue_app import blueApp #Creo instancia del manjador de usuarios local UserHandler = UserManager() #Creo instancia del manejador de usuarios OAuth OAuthHandler = OAuthUserManager() #Obtengo la instancia base de Flask para #poder acceder a todas las view functions app = current_app._get_current_object() #default value. #Indica si hay que ejecutar el checkeo o no run_check=True #request.endpoint es la peticion al servidor #app.view_functions contiene todas las view functions #definidas en la app. # #Si se cumple este if, significa que la ruta pedida por el cliente #es correcta y hay una view funciton asociada a ella if request.endpoint in app.view_functions: #Obtengo en view_func la funcion que se tiene que ejecutar #al acceder a la ruta que ha pedido el cliente. #Si por ejemlo se ha pedido la ruta '/', en view_func #tendremos al funcion webMain(). view_func = app.view_functions[request.endpoint] #Si la view function en custión no tiene un atributo #llamado '_exclude_from_checking', realizaremos una #comprobación de las cookies de sesión antes de ejecutar la #view function. #run_check= not hasattr(view_func, '_exclude_from_checking') #También hay que asegurarse de que la cadena '/static/' no #esté contenida en la URL de la petición, ya que si no, no #se podrán servir sus contenidos (código javascript y css) #a no ser que se haya iniciado sesión previamente, por lo que #pantallas como la de login no mostrarán el estilo. run_check= not hasattr(view_func, '_exclude_from_checking') \ and '/static/' not in request.path #DEBUG. Muestro datos if '/static/' not in request.path: logging.info('-~> Checkear cookies en %s? %s',str(request.path), str(run_check)) if run_check: #En la comprobación verifico que la sesión que indican #las cookies del usuario no está caducada. Si no existen se #da por hecho que no ha iniciado sesión. En ambos casos, habrá #que iniciarla. # #Obtengo tipo de Cookie : local o OAuth idTipo=request.cookies.get('tipoLogin') #Obtengo valor Cookie idSesion=request.cookies.get('SessionId') #Inicializo nombreUsuario nombreUsuario=None if idTipo=="local": #CADUCIDAD - BORRO Y ACTUALIZO sehaborrado=UserHandler.checkCookieStatus(idSesion) #Si la cookie ha caducado, me mostrara None como Usuario nombreUsuario = UserHandler.getCookieUserName(idSesion) elif idTipo=="oauth": #CADUCIDAD - BORRO Y ACTUALIZO sehaborrado=OAuthHandler.checkCookieStatus(idSesion) #Si la cookie ha caducado, me mostrara None como Usuario idUsuario = OAuthHandler.getCookieUserName(idSesion) nombreUsuario = OAuthHandler.getUserName(idUsuario) #DEBUG. Muesto info logging.debug("------CookieCheck----------") logging.debug("Tipo Sesion: " + str(idTipo)) logging.debug("SESION: " + str(idSesion)) logging.debug("Usuario: " + str(nombreUsuario)) try: logging.debug("Ha caducado: " + str(sehaborrado)) except UnboundLocalError: logging.debug("no hay cookies") #TEMP logging.debug("Sesiones Locales: " + str(UserHandler.listaSesiones)) logging.debug("Sesiones OAUTH: " + str(OAuthHandler.listaSesiones)) logging.debug("---------------------------") #Si el nombre de usuario es None, significa que la sesion ha #caducado o que no existe. Hay que hacer login. if nombreUsuario == None: logging.info("La sesión no existe o ha caducado."+ "Por favor, inicie sesión.") response = make_response(redirect(url_for('blueUser.webLogin'))) #Elimino cookies con datos de sesion como el umbral response.set_cookie('umbral', '', expires=0) return response #--- #return redirect(url_for('blueUser.webLogin')) else: logging.debug("Sesión válida. Hola " + str(nombreUsuario)) #You can handle 404s difeerently here if u want. else: #404 logging.info("La pagina "+ request.path +" no existe. Redirigiendo...") return redirect(url_for('blueApp.webMain'))
def cambiarUmbral(): logging.debug("/cambiarUmbral - METODO: " + str(request.method)) response = make_response("cambiarUmbral_placeholder") #Obtengo info de las cookies idSesion = request.cookies.get('SessionId') #tipo de login idTipo = request.cookies.get('tipoLogin') #inicio variables en caso de que no haya cookies en el cliente nombreUser = None nombreAMostrar = None #Creo instancia del manejador de usuarios local UserHandler = UserManager() #Creo instancia del manejador de usuarios OAuth OAuthHandler = OAuthUserManager() #OAUTH if idTipo == "oauth": nombreUser = OAuthHandler.getCookieUserName(idSesion) nombreAMostrar = OAuthHandler.getUserName(nombreUser) #LOCAL elif idTipo == "local": nombreUser = UserHandler.getCookieUserName(idSesion) nombreAMostrar = nombreUser #------- #GET if request.method == 'GET': response = render_template('changeUserUmbral.html', username=nombreAMostrar) #POST elif request.method == 'POST': #else: logging.debug("Estoy en POST") #umbral=request.form['umbral'] umbral = request.form.get('umbral', 101) #umbral = request.args.get('umbral', 101, type=float) # #resquest.args.get es mucho mejor, si no encuentra el argumento #'umbral' en vez de lanzar una excepcion da un valor por defecto, #el cual podemos especificar, asi como su tipo. # #INCORRECTO. request.args.get se emplea cuando se envian #parametros mediante GET (los cuales estarán incluidos en la #url). #Lo que es mejor que request.form[<nombreParam>] es #request.form.get(<nombreParam>, defaultValue), ya que de #esta forma, si no estan los parametros que intentamos #obtener, la funcion nos devolverá el valor por defecto #especificado en vez de 'None'. logging.debug("UMBRAL RECIBIDO: " + str(umbral)) logging.debug("tipo: " + str(type(umbral))) try: umbral = float(umbral) except ValueError: umbral = 101 #CAMBIO UMBRAL DEL USUARIO. if idTipo == "oauth": OAuthHandler.modUmbral(nombreUser, umbral) #response=make_response("UMB:"+str(OAuthHandler.getUmbral(nombreUser))) umbralDef = OAuthHandler.getUmbral(nombreUser) #response=make_response("UMB:"+str(umbralDef)) elif idTipo == "local": UserHandler.modUmbral(nombreUser, umbral) #response=make_response("UMB:"+str(UserHandler.getUmbral(nombreUser))) umbralDef = UserHandler.getUmbral(nombreUser) #response=make_response("UMB:"+str(umbralDef)) else: #EL usuario no ha hecho login. # #Los codigos de error de getUmbral() son: #-> 102: El usuario es 'None'. Es el valor que se obtiene cuando no se ha #iniciado sesión #-> 103: Indica que el nombre de usuario recibido no es válido, ya sea por tipo #(no string) o longitud. #-> 104: El usuario indicado no se ha encontrado en la base de datos. # #Los respuestas que se pueden obtener de modUmbral() van de -100 #a 104, invluyendo todos los códigos de error. Para indicar #es error que es que no se ha iniciado sesión, utilizaremos el #código 105. umbralDef = 105 #response=make_response("UMB:"+str(umbralDef)) #Los códigos de error los interpretaremos en el cliente #--- #En umbralDef tengo el resultado codigo de cambiar el umbral #La url a la que se debe dirigir el cliente si el umbral se #ha cambiado correctamente es url_for('blueApp.webMain') url = url_for('blueApp.webMain') #Creo los datos a enviar al cliente como JSON. #Deben tener el formato: #{"url" : url_a_redireccionar, #"code": codigo del resultado de la operacion} datos = {'url': url, 'code': umbralDef} logging.debug("RESPUESTA SERV: " + str(datos)) #Creo la respuesta para el cliente. #Contendrá loos datos en forma JSON response = make_response(jsonify(datos)) #Almaceno informacion del umbral en las cookies logging.debug(">>>>>>>>>>>>UMBRAL USUARIO: " + str(umbralDef)) response.set_cookie('umbral', str(umbralDef)) return response