对于已经设置 kerberos 权限的集群,访问各种组件的 HTTP 服务时会要求认证。如果客户端是 Windows,那么配置过程就比较复杂。
某些服务,例如 Apache Knox 通过转发的方式进行代理,可以进行 SPNEGO 鉴权。
我实现的是基于浏览器代理的方式修改请求头,并注入 token,以此完成鉴权。
HTTP 代理
HTTP 因为是明文传输,所以代理程序可以直接读取请求的内容。将内容完整转发,并将请求体返回,就完成了代理。
对于 HTTPS 这种情况,通过 CONNECT 请求的方式,让代理服务建立一条 tcp 连接隧道,通过更底层的协议,转发 HTTPS 流量。
SPNEGO 鉴权过程
对 HTTP Header 中的 Authorization 字段填入 token,服务器即可验证访问者的身份。jdk 实现了生成 token 这部分功能,调用接口即可。
后面发现基于 jaas 获取 token 配置有点麻烦,找到下层的 LoginContext,基于它的 api 实现了用户名密码校验。
实现
代码:https://github.com/simileas/spnego-proxy