Keycloak - OpenId Connect 访问类型

12

我想对一个旧的Java (6)应用程序进行身份验证,该应用程序当前使用基于Keycloak OIDC Bearer的node-js进行安全保护(两个应用程序属于同一域)。

我被告知要使用keycloak-authz-client库解析以下keycloak OIDC JSON:

{ "realm": "xxx", "realm-public-key": "fnzejhbfbhafbazhfzafazbfgeuizrgyez...", "bearer-only": true, "auth-server-url": "http://xxx:80/auth", "ssl-required": "external", "resource": "resourceName" }

然而,keycloak Java客户端需要Java 8,而我的当前运行时是JRE6。重新编译包括传递依赖项的库似乎不是一个好主意,因此我最终使用了keycloak oauth2 REST端点。

据我所知,我会采用client_credentials流程,一次在应用程序初始化时交换客户端密钥以获得访问令牌,当其过期时刷新/更新。

来到Keycloak文档:

访问类型

这定义了OIDC客户端的类型。

机密

机密访问类型适用于需要执行浏览器登录并在将访问代码转换为访问令牌时需要客户端密钥的服务器端客户端(有关更多详细信息,请参见OAuth 2.0规范中的Access Token Request)。此类型应用于服务器端应用程序。

公共

公共访问类型适用于需要执行浏览器登录的客户端端客户端。对于客户端应用程序,没有办法保护机密安全。相反,重要的是通过为客户端配置正确的重定向URI来限制访问。

仅承载

Bearer-only访问类型意味着该应用程序仅允许bearer token请求。如果打开此选项,则该应用程序无法参与浏览器登录。

看起来 confidential 访问类型适合我的需求(应该用于服务器端应用程序),但我不明白它与浏览器登录有什么关系(在我看来,浏览器登录涉及使用第三方身份提供者如 Facebook 进行身份验证)。

confidential 客户端设置还需要一个有效的重定向uri,成功登录或退出后浏览器将重定向到该uri。作为要认证的客户端是一个应用程序,我不明白它的意义所在。

总体而言,我不明白整个访问类型的内容。它只与客户端相关还是与资源所有者也相关 (我的node.js应用程序是否被限制为仅使用 bearer-only 访问类型?它是否接受使用 client_credentials flow 获得的 access_token 进行 bearer 验证?我想这样做应该可以)。

有人能够澄清 keycloak OIDC 访问类型以及如果我做错了哪些地方吗?

使用 keycloak,将我的遗留应用程序的访问委托给其他应用程序的一些资源(不限于特定用户)的正确方法是什么?

1个回答

3

您混淆了OAuth 2.0的客户端类型授权方式的概念。尽管这些概念相互关联,但它们是不同的。前者指的是应用程序架构,而后者指的是处理特定授权/身份验证用例所需的适当授权。

人们可以选择并组合这些选项;首先选择客户端类型(例如,publicconfidential),然后选择授权(例如,Authorization code flow)。两种客户端类型共享一些相同的授权,但需要注意的是,confidential客户端在执行身份验证/授权授予期间还需要提供客户端密钥。

来自Oauth 2.0规范

   OAuth defines two client types, based on their ability to
   authenticate securely with the authorization server (i.e., ability to
   maintain the confidentiality of their client credentials):

   confidential
      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.

   public
      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
      authentication via any other means.

如您所知,客户端类型指的是应用程序体系结构的类型。为什么需要这些类型呢?答案是为了增加额外的安全层次。

让我们看看授权代码授予的例子。通常,流程如下:

  • 用户前往应用程序;
  • 用户被重定向到Keycloak登录页面;
  • 用户进行身份验证;
  • Keycloak检查用户名和密码,如果正确,则返回授权代码给应用程序;
  • 应用程序收到该代码并调用Keycloak以交换代码以获得令牌。

这个流程中的一个“安全问题”是代码与令牌的交换发生在前端通道上,由于浏览器的特性,它容易受到黑客拦截代码并在真正的应用程序之前将其交换为令牌。有方法可以减轻这种情况,但超出了本问题的范围。

现在,如果您的应用程序是单页应用程序,则无法安全地存储密钥,因此我们必须使用公共客户端类型。但是,如果应用程序具有可以安全存储客户端密钥的后端,则可以使用机密客户端。

所以,对于相同的流程(即授权码授权),可以通过使用保密客户端使其更加安全。这是因为应用程序现在必须发送一个客户端密钥到Keycloak,并且这发生在后端通道上,比前端通道更加安全。

我如何正确地委派我的遗留应用程序访问另一个应用程序的某些资源(不限于特定用户)使用Keycloak?

正确的授权方式是使用所谓的客户端凭据授权

4.4. 客户端凭据授权

当客户端请求访问其控制下或已经与授权服务器事先安排的另一个资源所有者的受保护资源时(方法超出了本规范的范围),客户端只能使用其客户端凭据(或其他支持的身份验证手段)请求访问令牌。

由于此授权使用客户端凭据(例如,客户端密钥),因此只有选择机密类型作为客户端类型才能使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接