因为有需要通过 keycloak 进行授权的需求,一开始是想找看有没有官方提供的 lib ,结果发现因为各种原因(比如说框架太新、依赖没更上等)并没有能用的,强行找一个的结果就是出现各种诡异的错误(比如说 userid 始终为 null )。
然后考虑能不能直接调用 http 请求,自行拼接 header 和 body……postman 测试完全可以,只要自己记得保存 access_token 和 refresh_token 就行了。但是问题来了……
把登入时需要的信息保存下来,也就是大概会创建一个长这样的 store:
{
client_id: string, client_secret: string, ...
}
而且在调用 http request 的时候,也会把用户名和密码直接传过去。如果在浏览器里面打断点的话,可以直接取得当前的用户名和密码。就算是 app client ,也是可以通过 hack 进内存的方式获得这些敏感信息的吧。
如果把这些 passwd 和 token 在 store 里面 encrypt 的话,问题在于和 keycloak 通信的时候需要传输这个 token 本身,也就是说 encrypt 的内容必须能够被解密,在已知源代码或源代码产生物的时候,这样就意味着白加密了。
那么一般对待这些敏感信息的话,该用什么方式来处理以防止信息泄漏呢?
话说过来也看了一下现在在用的客户端开发的框架里面的非官方 keycloak 封装库……感觉就是直接在 http api 上封装了一层,压根没有讨论到加密的内容……所以大概也是不符合要求的了。
1
Rocketer 2022-12-31 08:26:44 +08:00 via iPhone 1
再读一遍 oauth 的原理吧,根本不用加密,也不要在 token 里存密码等敏感信息。
所谓 token ,就是一段能验证真伪的内容,一般存个用户 ID 就足够了。向服务端发请求时带上 token ,服务端就可以读出明文存储的用户 ID ,然后通过 token 里的附加信息验证真伪。确认用户身份后该干啥干啥。这里面没有涉及任何密码的验证。 |
2
netabare OP @Rocketer 这样呀……感谢解答。
看了一下这个讨论串( https://www.zhihu.com/question/20274730 ),oauth 好像也无法保证 secret 等内容泄漏的时候该怎么办,所以是要用 `process.env` 来存例如 secret 等关键信息嘛。 之前的想法是在客户端单独写个登入界面取得用户名密码后发起请求,这么看来感觉还是要用 Authorization code 跳转 auth 服务器登入后拿 code 的流程来做了。按照这个流程的话,在客户端里确实不需要和用户名密码打交道了。 |