使用 Keycloak 颁发“API 密钥”

Posted

技术标签:

【中文标题】使用 Keycloak 颁发“API 密钥”【英文标题】:Issuing "API keys" using Keycloak 【发布时间】:2019-02-13 06:50:41 【问题描述】:

我的设置包含三个组件:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

    创建新的客户端范围 选择“受众模板” 选择您要授予外部应用程序访问权限的服务,然后点击“下一步” 将范围添加到您刚刚创建的客户端(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 之类的内容,您会看到您正在设置客户端和密码

以上是关于使用 Keycloak 颁发“API 密钥”的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 颁发者验证和多租户方法

使用 Keycloak 时模拟“生成 API 令牌”的最佳实践

Keycloak:作为 docker 服务运行时令牌颁发者无效

Keycloak:为错误的客户模拟铸造令牌

Keycloak 返回已经过期的令牌

API Key 和 Developer Key 之间的 YouTube API 区别