Underground-Digital/Workflow-Engine
0
1import uuid2 3from flask import request4from flask_restful import Resource5from werkzeug.exceptions import NotFound, Unauthorized6 7from controllers.web import api8from controllers.web.error import WebSSOAuthRequiredError9from extensions.ext_database import db10from libs.passport import PassportService11from models.model import App, EndUser, Site12from services.enterprise.enterprise_service import EnterpriseService13from services.feature_service import FeatureService14 15 16class PassportResource(Resource):17 """Base resource for passport."""18 19 def get(self):20 system_features = FeatureService.get_system_features()21 app_code = request.headers.get("X-App-Code")22 if app_code is None:23 raise Unauthorized("X-App-Code header is missing.")24 25 if system_features.sso_enforced_for_web:26 app_web_sso_enabled = EnterpriseService.get_app_web_sso_enabled(app_code).get("enabled", False)27 if app_web_sso_enabled:28 raise WebSSOAuthRequiredError()29 30 # get site from db and check if it is normal31 site = db.session.query(Site).filter(Site.code == app_code, Site.status == "normal").first()32 if not site:33 raise NotFound()34 # get app from db and check if it is normal and enable_site35 app_model = db.session.query(App).filter(App.id == site.app_id).first()36 if not app_model or app_model.status != "normal" or not app_model.enable_site:37 raise NotFound()38 39 end_user = EndUser(40 tenant_id=app_model.tenant_id,41 app_id=app_model.id,42 type="browser",43 is_anonymous=True,44 session_id=generate_session_id(),45 )46 47 db.session.add(end_user)48 db.session.commit()49 50 payload = {51 "iss": site.app_id,52 "sub": "Web API Passport",53 "app_id": site.app_id,54 "app_code": app_code,55 "end_user_id": end_user.id,56 }57 58 tk = PassportService().issue(payload)59 60 return {61 "access_token": tk,62 }63 64 65api.add_resource(PassportResource, "/passport")66 67 68def generate_session_id():69 """70 Generate a unique session ID.71 """72 while True:73 session_id = str(uuid.uuid4())74 existing_count = db.session.query(EndUser).filter(EndUser.session_id == session_id).count()75 if existing_count == 0:76 return session_id77 