使用Keycloak发行“API密钥”

50

我的设置有三个组件:

  • 后端应用程序(Python/Flask)
  • 前端应用程序(VueJS)
  • Keycloak

前端将使用Keycloak让用户登录并使用访问令牌对后端进行身份验证。目前为止还不错。

现在我想让第三方应用程序能够对后端进行身份验证请求,我正在思考如何使用Keycloak实现这一点?我的想法是为每个客户发行一组新的凭据。然后他们的应用程序与Keycloak对话以获取访问令牌。然后我可以使用Keycloak来管理API的所有用户的访问控制。

  • 第三方应用程序在Keycloak中如何表示-客户端?用户? …?
  • 这种用例是否有最佳实践?
1个回答

61

我最终找到了一种有效的解决方案,这似乎是“Keycloak的方式”向外部应用程序发出凭证。要创建新的凭证,添加一个新的Keycloak客户端并更改以下设置:

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

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

授权客户端访问您的服务

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

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

现在,Keycloak将向它发放的所有JWT令牌的aud声明中添加您服务的名称,以供新客户端使用。请查看Keycloak关于服务账户的文档以获取更多详细信息。

交换客户端凭据以获取访问令牌

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

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

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

4
需要为每个第三方应用程序创建一个新的 Keycloak 客户端吗? - GGGforce
3
没错,这就是想法。不过我有一段时间没用过Keycloak了,所以这种方法可能已经过时了。 - Marco Lamina
7
我很确信这正是Keycloak想要的确切模型:1个客户端==1个应用程序。 - cacois
6
“Keycloak方式”的问题在于,世界上没有其他人这样做。 这不太对劲。其他所有人只是给开发人员一个API密钥,然后完成了它。 - GGGforce
3
如果您查看类似 https://developers.google.com/identity/protocols/oauth2 的内容,您将看到您正在设置客户端和密钥。 - Keith Nicholas
显示剩余4条评论

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