【问题标题】:Issuing "API keys" using Keycloak使用 Keycloak 颁发“API 密钥”
【发布时间】:2026-01-15 14:50:02
【问题描述】:

我的设置包含三个组件:

  • 后端应用程序 (Python/Flask)
  • 前端应用程序 (VueJS)
  • 钥匙斗篷

前端将使用 Keycloak 让用户登录并使用访问令牌对后端的请求进行身份验证。到目前为止,一切都很好。

现在我希望第三方应用程序能够向后端发出经过身份验证的请求,我想知道如何使用 Keycloak 来实现?我的想法是为每个客户颁发一组新的凭据。然后,他们的应用程序与 Keycloak 对话以获取访问令牌。然后我可以使用 Keycloak 来管理 API 的所有用户的访问控制。

  • 如何在 Keycloak - 客户端中表示第 3 方应用程序?用户? ...?
  • 这种用例是否有最佳实践?

【问题讨论】:

    标签: authentication oauth authorization keycloak


    【解决方案1】:

    我终于找到了一个运行良好的解决方案,似乎是向外部应用程序颁发凭据的“Keycloak 方式”。要创建一组新的凭据,请添加一个新的 Keycloak 客户端并更改以下设置:

    • 标准流已启用:关闭
    • 已启用直接访问授权:关闭
    • 访问类型:机密
    • 已启用服务帐户:开启

    外部应用程序将使用我们新创建的客户端名称作为client_idclient_secret 是自动生成的,可以在 Credentials 选项卡下找到。

    授予客户访问您的服务的权限

    如果您的受 Keycloak 保护的服务配置为检查传入 Bearer 令牌的 aud 声明,则需要执行第二步。默认情况下,Keycloak 向您的客户端发出的 JWT 令牌的受众将设置为您的客户端名称,因此它们将被您的服务拒绝。您可以使用Client Scopes 来修改该行为:

    1. 创建新的客户端范围
    2. 选择“受众模板”
    3. 选择您要授予外部应用程序访问权限的服务,然后点击“下一步”
    4. 将范围添加到您刚刚创建的客户端(Client Scopes 选项卡)

    Keycloak 现在会将您的服务名称添加到它颁发给您的新客户端的所有 JWT 令牌的 aud 声明中。查看Service Accounts 上的 Keycloak 文档了解更多详情。

    为访问令牌交换客户端凭据

    外部应用程序现在可以使用其凭据从 Keycloak 的令牌端点获取访问令牌:

    POST {keycloak-url}/auth/realms/atlas/protocol/openid-connect/token

    • Content-Type 标头设置为application/x-www-form-urlencoded
    • 使用基本身份验证对请求进行身份验证,使用您的客户端ID作为用户,使用您的客户端密码作为密码
    • 在请求正文中设置grant_type=client_credentials

    【讨论】:

    • 这是否意味着需要为每个 3rd 方应用程序创建一个新的 Keycloak 客户端?
    • 是的,就是这样。不过我已经有一段时间没有使用 Keycloak 了,所以这种方法可能已经过时了。
    • 我很确定这正是 Keycloak 想要的模型:1 个客户端 == 1 个应用程序
    • “Keycloak 方式”的问题在于世界上没有其他人这样做。感觉不对。其他人只需给开发人员一个 api 密钥并完成它。
    • @GGGforce 如果您检查developers.google.com/identity/protocols/oauth2 之类的内容,您会看到您正在设置客户端和密码