Flask-OIDC |用户登录后如何调用特定函数

Flask-OIDC | How to call a specific function after the user logged in

我使用 Flask OIDC 和 Keycloak 构建了一个登录系统。在我的系统中,有一些端点装饰有 oidc.require_login() 调用 Keycloak 登录页面。

我的目标是,在用户成功登录后,我的系统会检查用户名是否存在于特定数据库中。

如何设置每次有人使用 Keycloak 成功登录并在数据库中进行此验证时调用的函数?

根据您的需要,有多种方式可以在后台创建用户。

  • 最简单的方法是只检查每个请求的 JWT 令牌。 OIDC 基于 JWT,并且该令牌可用于任何请求(应该已经完成​​以查找用户角色等)。因此您的应用程序可以检查 JWT 并从中提取用户名(有关 JWT 格式的详细信息,请参阅 here)。使用用户名,您可以检查内部数据库并创建用户(如果不存在)。但那时您将无法再访问任何用户凭据。它只是 SSO,您需要信任 Keycloak 和 JWT...此外 - 如果用户将在 Keycloak 中被删除,您将永远不会被告知,这可能是一个问题。

  • 在 Keycloak 中有一个回调 API,每个客户端都以管理员 URL 的形式出现。但是文档并不清楚。它说:Keycloak 服务器使用它向应用程序发送后端请求以执行各种任务,例如注销用户或推送撤销策略。但是我找不到完整的“任务”列表。我只看到注销事件。 see Keycloak documentation 并且文档只讨论了这一点。如果我将管理员 url 添加到测试客户端,我在登录时没有收到任何请求。

  • 一种不同但更复杂的方法是在 Keycloak 中创建您自己的 UserStorage SPI。当然是 Java,但只有一些 类。还有一个HTTP example or have a look at the LDAP user storage SPI,也支持注册。如果您为您的领域选择它并且用户尝试登录到 Keycloak(登录表单),SPI 可以调用您的后端来检查用户。它还可以“用于”通过检查 Keycloak 本地存储在后端创建用户,并且仅当有本地 Keycloak 用户时,才调用后端。这不是您应该实施 UserStorage SPI 的原因,但这是可能的。如果您认为这是个好主意,我宁愿将您的后端存储用作唯一的存储或构建一个不同的存储,然后可以在新用户的情况下调用您的真实后端。我会通过不使用 Keycloak 本地存储用户来使用这个,而是使用你自己的数据库。

  • 下一个(也许是最后一个)。你可以写一个EventListener SPI to read all events and only filter the login events, see here and here。我认为,那将是最简单的一个。但请注意。在这种情况下,来自事件本身的对后端的 HTTP 调用基于正常的 HTTP 请求(当时没有 OIDC)。

最后两个示例创建了一个 JAR(在 link 中进行了解释)。带有 SPI 的 JAR 必须部署在 keycloaks standalone/deployments 文件夹中。 EventListener 应默认处于活动状态,UserStorage SPI 必须按领域激活。

但是 - 请注意 - Keycloak/SSO/JWT - 不应在多个后端创建用户时使用。在 SSO 环境中的所有后端之间同步用户可能是错误的方式。大多数信息位于 JWT 中,或者可以由一个中央用户身份管理的后端调用。不要多次存储用户。如果您需要后端中的用户引用 - link 仅指向用户名或用户 ID(字符串)而不是完整的实体。

没有直接的方法可以做到这一点,其他软件如 Openam、Okta 允许您在 post-登录配置中触发特定流程。

在 keycloak 中,您可以尝试创建自定义身份验证流程(使用默认身份提供程序,这是唯一允许重定向的选项),然后 select 在 [=21] 中的身份提供程序中创建此流程=] 登录流程。

这里的想法是,登录后,用户将被重定向到一个 link(一个 api 调用,该调用将验证他在外部数据库中的存在,并将他发送回 keycloak 一次验证完成。

More info here