我在摆弄Apache Superset,这是一个用Flask和Flask App Builder编写的开源工具。我想使用KeyCloak进行身份验证,但是由于它仅用于OpenID Connect,而flask_login仅用于OpenID 2,因此我必须对安全管理器进行一些扩展。很好,不太困难。是的,我可以使用OAuth 2,但暂时不使用它。
我面临的问题是,当我注销KeyCloak时,我想使用户退出烧瓶应用程序。诸如Microsoft的AD的OpenID Connect实现之类的功能可以调用与之关联的所有客户端应用程序的注销端点,但是就我阅读文档并在管理控制台中四处点击所知,KeyCloak不具备该功能。 / p>
我目前的解决方案是在OIDC id_token cookie上设置一个短期限;然后,当Cookie过期时,请使用KeyCloak进行检查,如果用户仍在其中登录,请刷新,否则,请注销flask应用程序。我使用“ user_loggedin”方法检查cookie。然后,如果Cookie过期,我可以重定向到KeyCloak登录服务器。然后,KeyCloak会话将确认用户仍在登录并重定向回所请求的页面,否则将需要登录。或者,我可以简单地手动从KeyCloak请求新令牌并重置cookie。如果用户仍在登录,KeyCloak将使用新令牌响应,否则,用户将被注销。
问题在于,经过几天的流血,汗水和仇恨,我无法正常工作。
我正在尝试在before_request
方法中运行检查。我不想更改超集项目中的任何现有代码,因此无论做什么我都必须在我的自定义安全管理器中进行。如果我尝试从before_request
方法中进行重定向,则会收到一条错误消息,提示“响应对象不可迭代”
我不知道before_request
方法是否是执行此操作的最佳位置,但是我不知道还有什么地方?
使问题更加棘手的是,匿名用户可能会访问某些页面,因此@login_required
装饰器不能仅仅放在某个方法的前面。仅当cookie先前已设置且现在已过期时,所有这些操作才真正发生。我在会话中设置了一个变量,以指示用户实际上已经登录,因此,当我检查OIDC id_token cookie时,我还要检查先前登录的会话密钥是否存在。