目前业务依赖大量的第三方 API,每个 API 都有自己的 authentication 的逻辑和相关 secrets ( client id,secrets 等等)。目前的做法是针对每个需要调用的应用都需要封装一层 API,然后将这些 secrets 用环境变量或者 config 来配置上去。
目前存在几个问题:
- 维护困难,一旦某个 secret 更新,需要挨个修改全部的应用,如果漏掉一个就会挂掉,部分应用需要紧急发布。
- 容易泄漏,这些 client secrets 比较重要,需要有权限控制。但是由于放在应用里面,任何一个应用开发者在本地启动的时候,都需要加载这些配置,一旦加载从内存等都是可以找到的。
目前的解决方案:
- 将这些 secrets 和逻辑收敛到一个 Web 应用中,这个应用将读取 secrets 然后支持接收请求,针对不同的第三方 API 进行对应的逻辑,比如获取 access token 然后附加到 request 上面转发给实际接口,然后返回接口的 response 。相当于透传请求,同时附加 access token 等信息。
- 这样只需要控制好这个应用的权限即可,维护 secrets 只需要修改一个地方。
但是这个解决方案的问题:
- 可能会形成单点故障,如果挂了的话。不过可以用 K8S 等方案解决。
- 请求本身来源的鉴权方式不好实现。由于可以被很多应用使用,这里假设最简单的情况就是没有任何校验,拿到任意请求均可透传。但问题很明显,一旦泄漏就完全没有秘密了。所以这个校验规则要如何实现? IP 白名单?还是再实现一套 OAuth 的校验?
所以目前的几个问题:
- 你的公司是否有类似需求?是如何实现的?
- 是否有开源或者 SaaS 服务提供类似的功能?这种技术或者需求是否有一个关键词?
- 数据库连接面临同样的需求,即避免将数据库用户密码等存放在各个应用中,数据库如何实现?
