使用Keycloak构建Java OAuth2.0授权服务器

Cho*_*hop 9 java oauth-2.0 keycloak

TL; DR

  • 目标:Java授权服务器:
    • 具有细粒度权限的OAuth2.0授权代码授予流程(不仅仅是SSO服务器)
    • 用户管理和认证:自定义数据库
    • 客户端管理和身份验证:Keycloak
  • 问题:使用Keycloak支持的应用权限处理实现Java授权服务器的最佳实践是什么?
    • 我应该在开发中使用什么Keycloak适配器/ API?
    • 如果要显示用户,应该如何管理/出现在Keycloak?

预警

我是Keycloak的初学者,虽然我认为我理解主要原则,但它似乎是一个丰富的工具,我担心我可能仍然会误解使用它的最佳方法的某些方面.请不要犹豫,纠正我.

上下文

我们正在寻求实现一个API,要求我们的用户(以下称"用户")向第三方应用程序(以下称"客户端")授予权限.

我们的用户存储在基于数据库的自定义现有用户管理系统中.至于我们的客户,我们正在考虑使用Keycloak.

用户同意将使用OAuth2.0授权代码授权流程给出.他们将登录,指定他们授予的权限以及他们拒绝的权限,然后客户端将检索将用于访问API的访问令牌.

我的理解是,Keycloak可以处理授权令牌,但它不应该知道任何适用的,我们的权限.因此,我想到构建一个自定义授权服务器,它将使用Keycloak来解决所有身份/身份验证问题,但会自行处理应用程序权限.

然后,我们将使用Keycloak进行客户端身份验证和授权代码/访问令牌管理,应用程序部分将检查权限.

问题

除了我的第一次试验,我已经在互联网上漫游了一个星期,我很惊讶,因为我认为这将是一个非常标准的案例.然而我发现它几乎没有,所以也许我没有正确搜索.

我发现了许多关于如何制作"简单授权服务器"的Spring/Spring Boot教程1.这些主要是SSO服务器,很少有管理权限,除了这个SO答案2中提到的那些.我认为我们可以处理.

我遇到的真正问题是,我找到的教程都没有处理,如下:

如何在此授权服务器中集成Keycloak?

我一直在看可用的Java适配器.在进行身份验证时,它们看起来还不错,但我没有看到如何从自定义授权服务器(即管理域)管理客户端的提示.

因此,我想我应该使用admin API.我是正确的,这是好的做法吗?我没有看到适配器,所以我想我应该使用REST API.

我也想知道我们应该如何将我们的用户整合到设计中?它们应该在Keycloak中重复吗?在这种情况下,我们是否应该使用Keycloak的管理API来从授权服务器推送数据,还是有更好的方法?

最后,我错过了一些其他明显的观点吗?

对于长信息和许多问题感到抱歉,但最终归结为一个问题:

使用Keycloak作为主干构建授权服务器时的最佳做法是什么?


1.一些例子: Spring Boot OAuth2教程 - 博客文章 - 另一篇博文

2.我主要关注Spring Security OAuth提供的示例应用程序

Mah*_*oya 2

使用Keycloak构建Java OAuth2.0授权服务器

这是可能的,但有点棘手,并且有很多东西需要定制。

您可以从下面的存储库中获得一些动机。

keycloak 委托授权同意

使用MITREid构建自定义 Java OAuth2.0 授权服务器

如果您愿意使用 Oauth 和 OIDC 的其他实现,我可以建议您 MITREid,它是 OIDC 的参考实现,可以进行大量定制。下面是其存储库及其开源的链接。

我自己用它来满足与您类似的需求,它是高度可定制的且易于实现。

https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server

MITREid Connect 使用 Spring Security 进行身份验证,因此您可以将任何您喜欢的组件放入该空间。网络上有很多关于如何为自定义身份验证机制编写和配置 Spring Security 过滤器的优质资源。

您需要查看 user-context.xml 文件以了解定义用户身份验证的位置。在核心项目中,这是针对本地数据库的简单用户名/密码字段。在其他项目(如 LDAP 覆盖项目)中,这会连接到 LDAP 服务器。在某些系统中,例如 MIT 的“oidc.mit.edu”服务器,实际上有一些可以并行使用的不同身份验证机制:LDAP、kerberos 和证书。

请注意,在所有情况下,您仍然需要有权访问某处的 UserInfo 数据存储。这可以来自数据库、LDAP 或其他内容,但它需要可供每个登录用户使用。

MITREid Connect 服务器可以同时充当 OpenID Connect 身份提供商 (IdP) 和 OAuth 2.0 授权服务器 (AS)。服务器是一个 Spring 应用程序,其配置文件位于 openid-connect-server-webapp/src/main/webapp/WEB-INF/ 中,并以 .xml 结尾。配置已分为多个 .xml 文件,以方便覆盖和自定义配置。