dify/api/controllers/inner_api/wraps.py

79 lines
2.1 KiB
Python
Raw Normal View History

2024-04-18 17:33:32 +08:00
from base64 import b64encode
from functools import wraps
from hashlib import sha1
from hmac import new as hmac_new
from flask import abort, request
2024-04-18 17:33:32 +08:00
2024-07-08 22:37:20 +08:00
from configs import dify_config
2024-04-18 17:33:32 +08:00
from extensions.ext_database import db
from models.model import EndUser
2024-07-08 22:37:20 +08:00
def enterprise_inner_api_only(view):
2024-04-18 17:33:32 +08:00
@wraps(view)
def decorated(*args, **kwargs):
if not dify_config.INNER_API:
2024-04-18 17:33:32 +08:00
abort(404)
# get header 'X-Inner-Api-Key'
inner_api_key = request.headers.get("X-Inner-Api-Key")
2024-09-20 13:32:11 +08:00
if not inner_api_key or inner_api_key != dify_config.INNER_API_KEY_FOR_PLUGIN:
abort(401)
2024-04-18 17:33:32 +08:00
return view(*args, **kwargs)
return decorated
2024-07-08 22:37:20 +08:00
def enterprise_inner_api_user_auth(view):
2024-04-18 17:33:32 +08:00
@wraps(view)
def decorated(*args, **kwargs):
if not dify_config.INNER_API:
2024-04-18 17:33:32 +08:00
return view(*args, **kwargs)
# get header 'X-Inner-Api-Key'
authorization = request.headers.get("Authorization")
2024-04-18 17:33:32 +08:00
if not authorization:
return view(*args, **kwargs)
parts = authorization.split(":")
2024-04-18 17:33:32 +08:00
if len(parts) != 2:
return view(*args, **kwargs)
user_id, token = parts
if " " in user_id:
user_id = user_id.split(" ")[1]
2024-04-18 17:33:32 +08:00
2024-12-24 18:38:51 +08:00
inner_api_key = request.headers.get("X-Inner-Api-Key", "")
2024-04-18 17:33:32 +08:00
data_to_sign = f"DIFY {user_id}"
2024-04-18 17:33:32 +08:00
signature = hmac_new(inner_api_key.encode("utf-8"), data_to_sign.encode("utf-8"), sha1)
2024-12-24 18:38:51 +08:00
signature_base64 = b64encode(signature.digest()).decode("utf-8")
2024-04-18 17:33:32 +08:00
2024-12-24 18:38:51 +08:00
if signature_base64 != token:
2024-04-18 17:33:32 +08:00
return view(*args, **kwargs)
kwargs["user"] = db.session.query(EndUser).filter(EndUser.id == user_id).first()
2024-04-18 17:33:32 +08:00
return view(*args, **kwargs)
return decorated
2024-07-08 22:37:20 +08:00
2024-09-14 02:47:01 +08:00
2024-07-08 22:37:20 +08:00
def plugin_inner_api_only(view):
@wraps(view)
def decorated(*args, **kwargs):
if not dify_config.PLUGIN_DAEMON_KEY:
2024-07-08 22:37:20 +08:00
abort(404)
# get header 'X-Inner-Api-Key'
2024-09-20 13:32:11 +08:00
inner_api_key = request.headers.get("X-Inner-Api-Key")
if not inner_api_key or inner_api_key != dify_config.INNER_API_KEY_FOR_PLUGIN:
2024-07-08 22:37:20 +08:00
abort(404)
return view(*args, **kwargs)
2024-09-20 13:32:11 +08:00
return decorated