mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-18 12:55:56 +08:00
feat: add webapp auth apis
This commit is contained in:
parent
509733fbf0
commit
2af1dd6de3
@ -1,12 +1,18 @@
|
|||||||
from flask_restful import marshal_with # type: ignore
|
import logging
|
||||||
|
|
||||||
|
from flask import request
|
||||||
|
from flask_login import current_user
|
||||||
|
from flask_restful import Resource, marshal_with, reqparse # type: ignore
|
||||||
|
|
||||||
from controllers.common import fields
|
from controllers.common import fields
|
||||||
from controllers.common import helpers as controller_helpers
|
from controllers.common import helpers as controller_helpers
|
||||||
from controllers.web import api
|
from controllers.web import api
|
||||||
from controllers.web.error import AppUnavailableError
|
from controllers.web.error import AppUnavailableError
|
||||||
from controllers.web.wraps import WebApiResource
|
from controllers.web.wraps import WebApiResource
|
||||||
|
from libs.passport import PassportService
|
||||||
from models.model import App, AppMode
|
from models.model import App, AppMode
|
||||||
from services.app_service import AppService
|
from services.app_service import AppService
|
||||||
|
from services.enterprise.enterprise_service import EnterpriseService
|
||||||
|
|
||||||
|
|
||||||
class AppParameterApi(WebApiResource):
|
class AppParameterApi(WebApiResource):
|
||||||
@ -42,5 +48,55 @@ class AppMeta(WebApiResource):
|
|||||||
return AppService().get_app_meta(app_model)
|
return AppService().get_app_meta(app_model)
|
||||||
|
|
||||||
|
|
||||||
|
class AppAccessMode(Resource):
|
||||||
|
def get(self):
|
||||||
|
parser = reqparse.RequestParser()
|
||||||
|
parser.add_argument("appId", type=str, required=True, location="args")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
app_id = args["appId"]
|
||||||
|
res = EnterpriseService.WebAppAuth.get_app_access_mode_by_id(app_id)
|
||||||
|
|
||||||
|
return {"accessMode": res.access_mode}
|
||||||
|
|
||||||
|
|
||||||
|
class AppWebAuthPermission(Resource):
|
||||||
|
def get(self):
|
||||||
|
user_id = "visitor"
|
||||||
|
try:
|
||||||
|
auth_header = request.headers.get("Authorization")
|
||||||
|
if auth_header is None:
|
||||||
|
raise
|
||||||
|
if " " not in auth_header:
|
||||||
|
raise
|
||||||
|
|
||||||
|
auth_scheme, tk = auth_header.split(None, 1)
|
||||||
|
auth_scheme = auth_scheme.lower()
|
||||||
|
if auth_scheme != "bearer":
|
||||||
|
raise
|
||||||
|
|
||||||
|
decoded = PassportService().verify(tk)
|
||||||
|
user_id = decoded.get("user_id", "visitor")
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
|
|
||||||
|
parser = reqparse.RequestParser()
|
||||||
|
parser.add_argument("appId", type=str, required=True, location="args")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
app_id = args["appId"]
|
||||||
|
user_id = current_user.id
|
||||||
|
logging.info(f"App ID: {app_id}, User ID: {user_id}")
|
||||||
|
|
||||||
|
app_code = AppService.get_app_code_by_id(app_id)
|
||||||
|
logging.info(f"App code: {app_code}")
|
||||||
|
|
||||||
|
res = EnterpriseService.WebAppAuth.is_user_allowed_to_access_webapp(str(user_id), app_code)
|
||||||
|
return {"result": res}
|
||||||
|
|
||||||
|
|
||||||
api.add_resource(AppParameterApi, "/parameters")
|
api.add_resource(AppParameterApi, "/parameters")
|
||||||
api.add_resource(AppMeta, "/meta")
|
api.add_resource(AppMeta, "/meta")
|
||||||
|
# webapp auth apis
|
||||||
|
api.add_resource(AppAccessMode, "/webapp/access-mode")
|
||||||
|
api.add_resource(AppWebAuthPermission, "/webapp/permission")
|
||||||
|
@ -19,7 +19,7 @@ from core.tools.utils.configuration import ToolParameterConfigurationManager
|
|||||||
from events.app_event import app_was_created
|
from events.app_event import app_was_created
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from models.account import Account
|
from models.account import Account
|
||||||
from models.model import App, AppMode, AppModelConfig
|
from models.model import App, AppMode, AppModelConfig, Site
|
||||||
from models.tools import ApiToolProvider
|
from models.tools import ApiToolProvider
|
||||||
from services.enterprise.enterprise_service import EnterpriseService
|
from services.enterprise.enterprise_service import EnterpriseService
|
||||||
from services.feature_service import FeatureService
|
from services.feature_service import FeatureService
|
||||||
@ -384,3 +384,15 @@ class AppService:
|
|||||||
meta["tool_icons"][tool_name] = {"background": "#252525", "content": "\ud83d\ude01"}
|
meta["tool_icons"][tool_name] = {"background": "#252525", "content": "\ud83d\ude01"}
|
||||||
|
|
||||||
return meta
|
return meta
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_app_code_by_id(app_id: str) -> str:
|
||||||
|
"""
|
||||||
|
Get app code by app id
|
||||||
|
:param app_id: app id
|
||||||
|
:return: app code
|
||||||
|
"""
|
||||||
|
site = db.session.query(Site).filter(Site.app_id == app_id).first()
|
||||||
|
if not site:
|
||||||
|
raise ValueError(f"App with id {app_id} not found")
|
||||||
|
return str(site.code)
|
||||||
|
@ -45,12 +45,12 @@ class EnterpriseService:
|
|||||||
if not data:
|
if not data:
|
||||||
raise ValueError("No data found.")
|
raise ValueError("No data found.")
|
||||||
|
|
||||||
if not isinstance(data['accessModes'], dict):
|
if not isinstance(data["accessModes"], dict):
|
||||||
logging.info(f"Batch get app access mode by id returns data: {data}")
|
logging.info(f"Batch get app access mode by id returns data: {data}")
|
||||||
raise ValueError("Invalid data format.")
|
raise ValueError("Invalid data format.")
|
||||||
|
|
||||||
ret = {}
|
ret = {}
|
||||||
for key, value in data['accessModes'].items():
|
for key, value in data["accessModes"].items():
|
||||||
curr = WebAppSettings()
|
curr = WebAppSettings()
|
||||||
curr.access_mode = value
|
curr.access_mode = value
|
||||||
ret[key] = curr
|
ret[key] = curr
|
||||||
|
Loading…
x
Reference in New Issue
Block a user