def get(self): """ Log user out by revoking his auth tokens. --- description: Once logged out, current user cannot access the API anymore. tags: - Authentification responses: 200: description: Logout successful 500: description: Access token not found """ try: logout() identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity()) except KeyError: return {"Access token not found."}, 500 logout_data = {"logout": True} if is_from_browser(request.user_agent): response = jsonify(logout_data) unset_jwt_cookies(response) return response else: return logout_data
def post(self): (email, password) = self.get_arguments() try: user = auth_service.check_auth(app, email, password) access_token = create_access_token(identity=user["email"]) refresh_token = create_refresh_token(identity=user["email"]) auth_service.register_tokens(app, access_token, refresh_token) identity_changed.send(current_app._get_current_object(), identity=Identity(user["id"])) if is_from_browser(request.user_agent): response = jsonify({"user": user, "login": True}) set_access_cookies(response, access_token) set_refresh_cookies(response, refresh_token) else: response = { "login": True, "user": user, "access_token": access_token, "refresh_token": refresh_token } return response except PersonNotFoundException: current_app.logger.info("User is not registered.") return {"login": False}, 400 except WrongUserException: current_app.logger.info("User is not registered.") return {"login": False}, 400 except WrongPasswordException: current_app.logger.info("User gave a wrong password.") return {"login": False}, 400 except NoAuthStrategyConfigured: current_app.logger.info( "Authentication strategy is not properly configured.") return {"login": False}, 400 except TimeoutError: current_app.logger.info("Timeout occurs while logging in.") return {"login": False}, 400 except UnactiveUserException: return { "error": True, "login": False, "message": "User is unactive, he cannot log in." }, 400 except OperationalError as exception: current_app.logger.error(exception) return { "error": True, "login": False, "message": "Database doesn't seem reachable." }, 500 except Exception as exception: if hasattr(exception, "message"): message = exception.message else: message = str(exception) return {"error": True, "login": False, "message": message}, 500
def add_permissions(callback): try: user = persons_service.get_current_user() identity_changed.send(current_app._get_current_object(), identity=Identity(user["id"])) return user except PersonNotFoundException: return None
def get(self): try: logout() identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity()) except KeyError: return {"Access token not found."}, 500 logout_data = {"logout": True} if is_from_browser(request.user_agent): response = jsonify(logout_data) unset_jwt_cookies(response) return response else: return logout_data
def post(self): (email, password) = self.get_arguments() try: user = auth_service.check_auth(app, email, password) del user["password"] if auth_service.is_default_password(app, password): token = uuid.uuid4() auth_tokens_store.add("reset-%s" % token, email, ttl=3600 * 2) current_app.logger.info("User must change his password.") return ( { "login": False, "default_password": True, "token": str(token), }, 400, ) access_token = create_access_token(identity=user["email"]) refresh_token = create_refresh_token(identity=user["email"]) auth_service.register_tokens(app, access_token, refresh_token) identity_changed.send(current_app._get_current_object(), identity=Identity(user["id"])) ip_address = request.environ.get("HTTP_X_REAL_IP", request.remote_addr) if is_from_browser(request.user_agent): organisation = persons_service.get_organisation() response = jsonify({ "user": user, "organisation": organisation, "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap", "login": True, }) set_access_cookies(response, access_token) set_refresh_cookies(response, refresh_token) events_service.create_login_log(user["id"], ip_address, "web") else: events_service.create_login_log(user["id"], ip_address, "script") response = { "login": True, "user": user, "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap", "access_token": access_token, "refresh_token": refresh_token, } return response except PersonNotFoundException: current_app.logger.info("User is not registered.") return {"login": False}, 400 except WrongUserException: current_app.logger.info("User is not registered.") return {"login": False}, 400 except WrongPasswordException: current_app.logger.info("User gave a wrong password.") return {"login": False}, 400 except NoAuthStrategyConfigured: current_app.logger.info( "Authentication strategy is not properly configured.") return {"login": False}, 400 except TimeoutError: current_app.logger.info("Timeout occurs while logging in.") return {"login": False}, 400 except UnactiveUserException: return ( { "error": True, "login": False, "message": "User is unactive, he cannot log in.", }, 400, ) except OperationalError as exception: current_app.logger.error(exception, exc_info=1) return ( { "error": True, "login": False, "message": "Database doesn't seem reachable.", }, 500, ) except Exception as exception: current_app.logger.error(exception, exc_info=1) if hasattr(exception, "message"): message = exception.message else: message = str(exception) return {"error": True, "login": False, "message": message}, 500
def post(self): """ Log in user by creating and registering auth tokens. --- description: Login is based on email and password. If no user match given email and a destkop ID, it looks in matching the desktop ID with the one stored in database. It is useful for clients that run on desktop tools and that don't know user email. tags: - Authentification parameters: - in: body name: Credentials description: The email and password of the user schema: type: object required: - email - password properties: email: type: string password: type: string responses: 200: description: Login successful 400: description: Login failed 500: description: Database not reachable """ (email, password) = self.get_arguments() try: user = auth_service.check_auth(app, email, password) if "password" in user: del user["password"] if auth_service.is_default_password(app, password): token = uuid.uuid4() auth_tokens_store.add("reset-%s" % token, email, ttl=3600 * 2) current_app.logger.info("User must change his password.") return ( { "login": False, "default_password": True, "token": str(token), }, 400, ) access_token = create_access_token(identity=user["email"]) refresh_token = create_refresh_token(identity=user["email"]) auth_service.register_tokens(app, access_token, refresh_token) identity_changed.send( current_app._get_current_object(), identity=Identity(user["id"]), ) ip_address = request.environ.get("HTTP_X_REAL_IP", request.remote_addr) if is_from_browser(request.user_agent): organisation = persons_service.get_organisation() response = jsonify({ "user": user, "organisation": organisation, "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap", "login": True, }) set_access_cookies(response, access_token) set_refresh_cookies(response, refresh_token) events_service.create_login_log(user["id"], ip_address, "web") else: events_service.create_login_log(user["id"], ip_address, "script") response = { "login": True, "user": user, "ldap": app.config["AUTH_STRATEGY"] == "auth_remote_ldap", "access_token": access_token, "refresh_token": refresh_token, } return response except PersonNotFoundException: current_app.logger.info("User is not registered.") return {"login": False}, 400 except WrongUserException: current_app.logger.info("User is not registered.") return {"login": False}, 400 except WrongPasswordException: current_app.logger.info("User gave a wrong password.") return {"login": False}, 400 except NoAuthStrategyConfigured: current_app.logger.info( "Authentication strategy is not properly configured.") return {"login": False}, 400 except TimeoutError: current_app.logger.info("Timeout occurs while logging in.") return {"login": False}, 400 except UnactiveUserException: return ( { "error": True, "login": False, "message": "User is inactive, he cannot log in.", }, 400, ) except OperationalError as exception: current_app.logger.error(exception, exc_info=1) return ( { "error": True, "login": False, "message": "Database doesn't seem reachable.", }, 500, ) except Exception as exception: current_app.logger.error(exception, exc_info=1) if hasattr(exception, "message"): message = exception.message else: message = str(exception) return {"error": True, "login": False, "message": message}, 500