Replies: 1 comment
|
感谢整理这份提案。我们认同其中的核心判断:当一个运行实例中存在多组连接时,仅靠调用方传入 不过,我们对 OpenConnector 的职责边界有不同看法。 OpenConnector 不关心一个运行实例最终服务一个还是多个外部主体,也不应该理解上层产品里的用户、组织、成员或工作空间模型。用户身份、连接归属、成员权限和组织级审计仍应以上层产品为准。 基于这个边界,我们暂时不打算在 OpenConnector 的核心模型中引入 这里的 概念上可以理解为: interface Connection {
id: string;
scope: string;
service: string;
connectionName: string;
}
interface RuntimeTokenRecord {
id: string;
tokenHash: string;
scope: string;
allowedActions?: string[];
blockedActions?: string[];
expiresAt?: string;
revokedAt?: string;
}外部调用方不直接传递 Authorization: Bearer OpenConnector 验证 token 后,根据服务端保存的 token record 生成内部授权结果: interface RuntimeGrant {
tokenId: string;
scope: string;
allowedActions?: string[];
blockedActions?: string[];
}之后,OpenConnector 使用 外部产品可以按下面的流程接入: 外部系统验证用户和 workspace 权限 这样既能由 OpenConnector 强制实施资源隔离,也不需要它知道一个 对于 runtime token 的生命周期,我们会区分可更新的授权策略和不可变的安全域:
这可以避免已经分发的 token 在调用方不知情时被切换到另一个资源范围。 另外还有几条原则:
我们想确认的是: 如果不能,具体缺口是什么?例如:
|
Uh oh!
There was an error while loading. Please reload this page.
背景
我们正在评估把 OpenConnector 作为一个多用户产品中的连接器执行后端。当前的本地单用户模型很清晰:连接由
service + connection_name标识,调用方通过运行令牌执行动作。这很适合个人使用或少量可信成员共享一个运行实例。当同一个运行实例服务多个终端用户或多个工作空间时,还需要回答几个安全问题:
connection_name使用别人的连接?Roadmap #65 已经规划了运行令牌级动作策略,同时把完整角色权限、多租户团队权限、组织和用户管理列为当前非目标。我认同 OpenConnector 不应该自行建设一套用户、组织或登录系统;但可以考虑提供一层通用的“外部身份上下文和连接归属”能力,让上层产品负责身份与组织管理,OpenConnector 只负责隔离、授权和执行。
目标
希望在不引入完整用户系统的前提下,支持以下能力:
建议的抽象
为了避免 OpenConnector 耦合某一种组织模型,可以只引入两个不透明标识:
namespace_id:外部系统中的租户、项目或工作空间。subject_id:外部系统中的用户、服务账号或代理主体。OpenConnector 不解释这两个标识,也不管理它们的生命周期,只把它们作为授权和数据隔离上下文。
连接可以增加以下归属信息:
private:只有连接所有者可以使用。namespace:同一范围内、具备相应权限的主体可以使用。运行令牌与执行上下文
可以在 Roadmap #65 的“运行令牌级动作规则”基础上继续扩展:
每次执行先完成:
公开运行接口最好使用不可枚举的
connection_id或服务端解析出的连接引用。connection_name可以继续作为本地管理别名,但不应独立构成跨用户环境中的授权依据。OAuth 上下文
建议待授权状态增加:
其中
returnUrl必须经过配置白名单校验,避免开放重定向。OAuth 回调完成后,运行时根据服务端保存的状态写入连接归属,不接受浏览器在回调阶段重新指定归属。存储与隔离
SQLite 和 D1 都可以通过向现有表增加归属字段与组合索引实现第一版:
connections:增加内部连接标识、命名空间、所有者和可见性。runtime_tokens:增加主体与授权范围,或者拆分令牌和范围关联表。oauth_states:保存授权发起时的身份上下文。runs:记录令牌、主体、命名空间、连接和追踪标识。所有查询都应把归属范围作为存储层接口的必填上下文,避免只依赖路由层约定。未来增加其他数据库实现时,也可以沿用同一存储契约。
明确不做的事情
这个提案不要求 OpenConnector 实现:
这些仍由上层产品负责。OpenConnector 只接收已经验证的外部身份上下文,并确保连接、令牌和执行记录不会跨范围泄露。
建议的实施顺序
我们愿意贡献
如果维护者认可这个方向,我们愿意继续整理架构决策、数据库迁移和接口兼容设计,并承担其中一部分实现与测试。比较合适的第一步可能是:
希望先确认几个问题:
namespace_id / subject_id,是否比内建租户、工作空间和用户模型更符合项目方向?All reactions