如何让我的 Spring Boot 应用程序使用给定的用户名和密码登录到 keycloak?

Posted

技术标签:

【中文标题】如何让我的 Spring Boot 应用程序使用给定的用户名和密码登录到 keycloak?【英文标题】:How can I make my spring boot application to log in to keycloak with given username and password? 【发布时间】:2021-03-21 01:30:18 【问题描述】:

我有一个 spring-boot 应用程序,我正在使用 keycloak 对用户进行身份验证。我打算在我的应用程序中创建一个等待用户名和密码的端点,它登录到 keycloak,如果用户名/密码有效,则请求访问令牌并将其返回给用户。

我怎样才能使这个登录到keycloak?

正如我所见,我需要一个 public 客户端才能让我的 keycloak 使用用户名/密码,但这不包含任何 resource_id,所以我需要来自 confidential 客户端的 access_token

我是否应该向公共客户端请求access_token,如果响应代码为200(因此登录成功),则向confidential 客户端发送另一个请求以取回access_token真的有效吗?

提前致谢。

【问题讨论】:

【参考方案1】:

我计划在我的应用程序中创建一个端点,等待 用户名和密码,它会登录到 keycloak,如果 用户名/密码有效 请求访问令牌并将其返回给 用户。

如果您正确配置了 Spring 应用程序,并且您的用户将通过身份验证的 Keycloak 客户端使用 Authorization Code Flowie, 在 Keycloak 上启用标准流程),则用户登录到您的应用程序, 被重定向到 Keycloak,并验证自己。如果用户成功通过身份验证,用户将被重定向(可能)回您的应用,并且该应用将取回访问令牌等。然后可以使用该访问令牌代表经过身份验证的用户执行操作。

正如我所见,我需要一个公共客户端才能使用我的 keycloak 用户名/密码,但这不包含任何资源 ID,所以我需要 来自机密客户的 access_token。

从RFC 6749 OAuth 2.0 specification可以阅读:

机密

  Clients capable of maintaining the confidentiality of their
  credentials (e.g., client implemented on a secure server with
  restricted access to the client credentials), or capable of secure
  client authentication using other means.

公开

  Clients incapable of maintaining the confidentiality of their
  credentials (e.g., clients executing on the device used by the
  resource owner, such as an installed native application or a web
  browser-based application), and incapable of secure client

由于您使用的不是网络浏览器应用程序或手机,而是具有安全后端的 spring-boot 应用程序,因此您应该使用confidential client.

如果您的意思是要使用 "Resource Owner Password Credentials Grant"(在 Keycloak 中启用直接访问授权),那么您就是在混合内容。您仍然可以在没有客户保密的情况下与我们一起使用。使用 public client 从 Keycloak 请求令牌:

POST -d "client_id=<client_id>"
     -d "username=<username>"
     -d "password=user_password"
     -d "grant_type=password"
      <KEYCLOAK_HOST>/auth/realms/<REALM_NAME>/protocol/openid-connect/token>

confidential client:

POST -d "client_id=<client_id>"
     -d "client_secret=<client_secret>"
     -d "username=<username>"
     -d "password=user_password"
     -d "grant_type=password"
      <KEYCLOAK_HOST>/auth/realms/<REALM_NAME>/protocol/openid-connect/token>

你得到了额外的字段-d "client_secret=&lt;client_secret&gt;"

但请记住:

资源所有者密码凭据授予类型适用于 资源所有者与资源所有者有信任关系的情况 客户端,例如设备操作系统或高特权 应用。 授权服务器应特别注意以下情况 启用此授权类型,并且仅在其他流未启用时才允许 可行。

【讨论】:

以上是关于如何让我的 Spring Boot 应用程序使用给定的用户名和密码登录到 keycloak?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 docker run 命令中将 Java 选项/变量传递给 Spring Boot 应用程序

多线程 Spring-boot 控制器方法

如何检查spring boot应用程序在自动配置类中是不是有某个注释

在 Spring Boot MVC 中添加 ShallowEtagHeaderFilter

允许用户使用 jwt 在 Spring Boot 中选择资源

如何将外部jar文件传递给spring boot项目? [复制]