我有一个ActiveMQ Artemis服务器,我的应用程序通过STOMP通过WebSockets连接。Artemis正在使用Keycloak验证凭据。我将令牌作为CONNECT
帧的一部分传递。
连接工作正常,但是,一旦令牌过期,与打开的WebSocket的任何交互(例如订阅、取消订阅等)导致客户端断开,因为令牌过期。这是意料之中的。
我可以做什么来只在连接时验证令牌?如果连接成功,我不希望Artemis再验证令牌。连接应该是合法的,一旦接受在开始。
如果这不可能,因为我在Web客户端上有更新的令牌,我如何通知Artemis以便它在内部更新此令牌?
1条答案
按热度按时间woobm2wo1#
如the documentation中所述,当客户端连接并通过代理验证时,验证结果将被缓存。对于必须授权的任何操作也是如此(例如创建消费者、发送消息等)。只要代理的缓存包含所需的条目,令牌是否过期就没有关系。然而,当缓存条目过期时,代理将不得不重新连接到Keycloak以再次获得所需的auth。如果原始令牌仍然有效,那么一切都很好,但如果令牌已过期,则auth将失败。因此,您可以配置该高速缓存以帮助您避免过期令牌的问题。配置详细信息请参见文档:
缓存的大小由
authentication-cache-size
和authorization-cache-size
配置参数控制。两者都默认为1000
。缓存条目的有效时间由
security-invalidation-interval
控制,以毫秒为单位。使用0
将禁用缓存。默认值为10000
ms。也就是说,令牌到期是有原因的。例如,不推荐无限期地缓存令牌,因为这将是不安全的,并且将浪费代理上的资源(即,用于该高速缓存的存储器)。
遗憾的是,STOMP协议不支持重新认证。一旦令牌过期并且代理的缓存条目无效,您只需重新连接即可。