使用 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_id
。 client_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 时模拟“生成 API 令牌”的最佳实践