使用 Keycloak 构建 Java OAuth2.0 授权服务器
Posted
技术标签:
【中文标题】使用 Keycloak 构建 Java OAuth2.0 授权服务器【英文标题】:Building a Java OAuth2.0 authorization server with Keycloak 【发布时间】:2018-08-15 10:55:25 【问题描述】: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 服务器,很少管理权限,除了this SO answer2 中提到的那些。我认为我们可以处理。
我遇到的真正问题是以下几点:
如何将 Keycloak 集成到此授权服务器中?
我一直在看available Java Adapters。在进行身份验证时,它们看起来不错,但我没有看到有关如何从自定义授权服务器管理客户端(即管理领域)的提示。
因此我假设我应该使用管理 API。我是否正确,这是一种好习惯吗?我没有看到任何适配器,所以我想我应该使用 REST API。
我也想知道我们应该如何将我们的用户整合到设计中?他们应该在 Keycloak 中复制吗?在这种情况下,我们应该使用 Keycloak 的 admin API 从授权服务器推送数据还是有更好的方法?
最后,我是否遗漏了其他一些明显的观点?
对不起,长消息和许多问题,但最终都归结为一个问题:
使用 Keycloak 作为主干构建授权服务器时的最佳做法是什么?
1。一些例子: Spring Boot OAuth2 tutorial - A blog post - Another blog post
2。我主要关注the sample app provided by Spring Security OAuth
【问题讨论】:
【参考方案1】:使用 Keycloak 构建 Java OAuth2.0 授权服务器
这是可能的,但有点棘手,需要定制的东西很多。
你可以从下面的回购中获得一些动力。
keycloak-delegate-authn-consent
使用MITREid构建自定义Java OAuth2.0授权服务器
如果您愿意使用 Oauth 和 OIDC 的其他实现,我可以建议您使用 MITREid,它是 OIDC 的参考实现,可以进行大量定制。以下是其 repo 和开源的链接。
我自己用这个来满足与你类似的需求,它是高度可定制且易于实现的。
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 文件,以方便覆盖和自定义配置。
【讨论】:
以上是关于使用 Keycloak 构建 Java OAuth2.0 授权服务器的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Angular -> Spring Boot Oauth2 -> Keycloak 获取 keycloak 令牌
Spring OAuth2 使用 Keycloak 自动登录
如何在 Flask-Appbuilder 中为 OAuth2.0 使用自定义提供程序 [keycloak]?
需要使用 Keycloak 和 oAuth2 保护普通 Spring REST API 的示例
Keycloak cookie:KEYCLOAK_SESSION、Oauth_token_request_state、KEYCLOAK_IDENTITY