| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | import uuidfrom flask import requestfrom flask_restful import Resourcefrom werkzeug.exceptions import NotFound, Unauthorizedfrom controllers.web import apifrom controllers.web.error import WebSSOAuthRequiredErrorfrom extensions.ext_database import dbfrom libs.passport import PassportServicefrom models.model import App, EndUser, Sitefrom services.feature_service import FeatureServiceclass PassportResource(Resource):    """Base resource for passport."""    def get(self):        system_features = FeatureService.get_system_features()        if system_features.sso_enforced_for_web:            raise WebSSOAuthRequiredError()        app_code = request.headers.get('X-App-Code')        if app_code is None:            raise Unauthorized('X-App-Code header is missing.')        # get site from db and check if it is normal        site = db.session.query(Site).filter(            Site.code == app_code,            Site.status == 'normal'        ).first()        if not site:            raise NotFound()        # get app from db and check if it is normal and enable_site        app_model = db.session.query(App).filter(App.id == site.app_id).first()        if not app_model or app_model.status != 'normal' or not app_model.enable_site:            raise NotFound()        end_user = EndUser(            tenant_id=app_model.tenant_id,            app_id=app_model.id,            type='browser',            is_anonymous=True,            session_id=generate_session_id(),        )        db.session.add(end_user)        db.session.commit()        payload = {            "iss": site.app_id,            'sub': 'Web API Passport',            'app_id': site.app_id,            'app_code': app_code,            'end_user_id': end_user.id,        }        tk = PassportService().issue(payload)        return {            'access_token': tk,        }api.add_resource(PassportResource, '/passport')def generate_session_id():    """    Generate a unique session ID.    """    while True:        session_id = str(uuid.uuid4())        existing_count = db.session.query(EndUser) \            .filter(EndUser.session_id == session_id).count()        if existing_count == 0:            return session_id
 |