Xero API令牌存储与复用问题咨询:多租户多用户场景
Xero令牌存储与复用规范方案
核心结论
必须按用户ID维护独立的access/refresh令牌对,且需关联每个用户已授权的租户列表。Xero的令牌机制与用户授权上下文强绑定,单令牌复用会直接覆盖原有租户的授权权限,导致老租户访问失败。
为什么单令牌方案会出问题
Xero的refresh token和access token是与特定用户的授权会话绑定的:
- 当新用户授权新租户时,若用同一套令牌执行刷新操作,新的授权上下文(租户列表)会完全替换原有令牌的授权范围
- 原有已授权的租户会被从令牌的可用组织列表中移除,导致后续访问这些租户时返回权限错误
正确的令牌存储策略
- 按用户ID拆分存储:解析access token(JWT格式)中的
sub字段获取用户ID,为每个唯一用户ID存储一套独立的access/refresh令牌对 - 关联租户元数据:在存储令牌时,同步记录该用户已授权的所有租户ID、租户名称等信息(授权流程中Xero会直接返回租户列表,无需额外调用接口)
用户与授权组织的关系跟踪方案
- 存储结构示例:
用户ID: user_123 - Access Token: xxxxxx - Refresh Token: yyyyyy - 授权租户列表: [org_456, org_789] - 租户访问逻辑:
- 当需要访问某个租户(如org_789)时,直接查询所有包含该租户ID的用户令牌记录
- 若同一租户有多个用户授权(如用户A和用户B都授权了Org2),可根据业务需求选择令牌(比如优先使用最近刷新过的,或特定用户的令牌)
- 无需遍历所有令牌调用
GetOrganizations(),提前存储的租户列表可直接匹配
避免断开连接的关键操作
- 令牌过期时,必须使用对应用户的refresh token执行刷新,禁止跨用户复用令牌刷新
- 定期校验令牌有效性:每隔一段时间调用
GetOrganizations(),确认存储的租户列表与令牌实际授权范围一致,若租户丢失则触发重新授权流程 - 禁止共享令牌:每个用户的令牌是独立的授权凭证,跨用户复用会导致授权上下文混乱
内容的提问来源于stack exchange,提问作者Ryan P
相关产品推荐
相关产品推荐

