diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32ee3c4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.db +*.log +pgdata/ \ No newline at end of file diff --git a/README.md b/README.md index 150e728..4283869 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ ConnectHub 是一个轻量级企业集成中间件:统一管理多系统集成 - `DATA_DIR=/data`:容器内数据目录 - `DB_URL=postgresql+psycopg://connecthub:connecthub_pwd_change_me@postgres:5432/connecthub`:PostgreSQL 连接串(容器内通过 service name `postgres` 访问) - `REDIS_URL=redis://redis:6379/0`:Celery Broker/Backend - - `FERNET_KEY_PATH=/data/fernet.key`:Fernet key 文件(自动生成并持久化) + - `FERNET_KEY_PATH=/data/fernet.key`:Fernet key 文件(自动生成并持久化;**正式环境必须保留同一个 key,否则历史 secret_cfg 将无法解密**) - `LOG_DIR=/data/logs`:日志目录(可选) ### 核心框架实现要点 diff --git a/app/security/fernet.py b/app/security/fernet.py index dcd6e90..a7f3fe4 100644 --- a/app/security/fernet.py +++ b/app/security/fernet.py @@ -54,6 +54,20 @@ def encrypt_json(obj: dict[str, Any]) -> str: def decrypt_json(token: str) -> dict[str, Any]: if not token: return {} + token = token.strip() + + # 兼容:历史/手工输入导致误存明文 JSON + if token.startswith("{"): + try: + obj = json.loads(token) + if isinstance(obj, dict): + return obj + except Exception: + pass + + # 兼容:末尾 padding '=' 被裁剪导致 base64 解码失败(len % 4 != 0) + if token and (len(token) % 4) != 0: + token = token + ("=" * (-len(token) % 4)) try: raw = _fernet().decrypt(token.encode("utf-8")) except InvalidToken as e: diff --git a/extensions/sync_oa_to_didi/job.py b/extensions/sync_oa_to_didi/job.py index 5f9d6bd..f16c587 100644 --- a/extensions/sync_oa_to_didi/job.py +++ b/extensions/sync_oa_to_didi/job.py @@ -19,7 +19,7 @@ def _mask_token(token: str) -> str: class SyncOAToDidiTokenJob(BaseJob): """ - 示例 Job:演示致远 OA 的 token 获取与日志记录(不做任何业务同步)。 + 示例 Job:演示致远 OA 的 token 获取与日志记录 public_cfg: - base_url: "https://oa.example.com"