升级Apache Guacamole至1.6.0后令牌认证失效问题排查
关于Apache Guacamole 1.6.0认证机制变更的问题
问题场景
我的React-Admin Web应用中有一个页面通过Apache Guacamole代理至其他站点,原认证逻辑包含三步API调用:
- 从本地数据库获取
guacProxyUrl; - 向
guacProxyUrl的/api/tokens端点发起POST请求,发送用户名和密码完成认证; - 打开新窗口访问
guacProxyUrl。
原实现代码如下:
const authenticateAndOpenGuacamole = (record) => { axios( withAuth({ url: getGuacInfoUrl(record), }) ).then(({ data }) => { const { guacProxyUrl } = data; axios( withAuth({ url: `${guacProxyUrl}api/tokens`, method: 'post', data: `username=${record.guacUsername}&password=${record.guacPassword}`, }) ).then(({ data }) => { localStorage.setItem('GUAC_AUTH', JSON.stringify(data)); window.open(guacProxyUrl, '_blank'); }); }); };
未修改应用代码,仅将Guacamole从1.5.5升级至1.6.0后,该认证逻辑失效。目前已找到修复方案:将window.open(guacProxyUrl, '_blank');替换为window.open(${guacProxyUrl}#/?token=${data.authToken}, '_self');,通过URL显式传递认证令牌。
但在1.5.5版本中,无需在window.open中传递凭据即可正常认证,首次认证后后续访问会自动携带Guacamole认证令牌,而1.6.0版本不再自动携带。请问这是否是1.5.5版本中GUAC_LOCAL存储的机制在1.6.0中被变更?(参考旧问题:GUACAMOLE-549)
解答
是的,Apache Guacamole 1.6.0确实对客户端的认证令牌存储与传递机制做了变更:
- 在1.5.5及更早版本中,调用
/api/tokens获取认证令牌后,Guacamole的前端会自动将令牌存储在localStorage的GUAC_LOCAL相关键中,当通过新窗口打开Guacamole页面时,前端能直接读取该存储的令牌完成自动认证,无需显式传递。 - 1.6.0版本调整了这一逻辑,不再依赖跨窗口的
localStorage共享来自动携带令牌。这一变更和GUACAMOLE-549问题的优化方向一致,主要是为了提升安全性,避免因跨窗口存储共享带来的令牌泄露风险,因此强制要求通过URL的#/?token=参数显式传递认证令牌,也就是你现在使用的修复方案。
内容的提问来源于stack exchange,提问作者Woodchuck
相关产品推荐
相关产品推荐

