在 Keycloak 中使用 OpenID Connect 的两个用例有啥区别? (客户端与应用程序)
Posted
技术标签:
【中文标题】在 Keycloak 中使用 OpenID Connect 的两个用例有啥区别? (客户端与应用程序)【英文标题】:What is the difference between the two use cases of using OpenID Connect in Keycloak? (Client vs Application)在 Keycloak 中使用 OpenID Connect 的两个用例有什么区别? (客户端与应用程序) 【发布时间】:2020-10-14 19:00:17 【问题描述】:我对 SSO 和 Keycloak 的概念非常陌生。我正在尝试阅读 Keycloak 的官方文档。在“支持的协议”部分 (https://www.keycloak.org/docs/latest/securing_apps/index.html),文档谈到了使用 OIDC 的两个用例,如下所示:
“第一个是一个应用程序,它要求 Keycloak 服务器为他们验证用户。成功登录后,应用程序将收到一个身份令牌和一个访问令牌。身份令牌包含有关用户的信息,例如用户名,电子邮件和其他个人资料信息。访问令牌由领域进行数字签名,并包含应用程序可以用来确定允许用户访问应用程序的哪些资源的访问信息(如用户角色映射)。
第二种类型的用例是客户端想要访问远程服务。在这种情况下,客户端要求 Keycloak 获取一个访问令牌,它可以用来代表用户调用其他远程服务。 Keycloak 对用户进行身份验证,然后请求用户同意授予对请求它的客户端的访问权限。客户端然后接收访问令牌。此访问令牌由领域进行数字签名。客户端可以使用此访问令牌对远程服务进行 REST 调用。 REST 服务提取访问令牌,验证令牌的签名,然后根据令牌内的访问信息决定是否处理请求。”
我不明白的是:在第一段中它谈到了一个应用程序发出请求,而在第二段中它谈到了一个客户端。但是应用程序不被视为客户端吗?为什么要具体区分?谁能给出第二部分中讨论的远程服务的示例?
谢谢。
【问题讨论】:
【参考方案1】:但是应用程序不被算作客户端吗?为什么要具体区分?谁能给出第二部分中讨论的远程服务的示例?
没错。差异化的原因是因为可能有许多应用程序,而不仅仅是这一个客户端。用户被授权的客户端可能想要访问所有其他应用程序的数据。
以谷歌生态系统为例。谷歌电子邮件是否可以访问驱动器和照片等...虽然它可以开箱即用,但它没有。您需要明确允许电子邮件“离线访问”这些其他应用程序,即使它们都是同一平台的一部分。
Keycloak 理解这一点并提供该术语。但这有点令人困惑,因为这不是考虑它的最佳方式。相反,更好的解释是只有用户和服务客户端。服务客户端都相互交谈并询问用户的数据。虽然用户可能通过直接访问一个应用程序来获取他们的数据,但其他应用程序也可能需要该用户的数据。
假设您实际上希望允许一个服务从另一个服务请求用户数据,您希望使用支持授权作为服务的东西,而不仅仅是身份验证。有一些这样的例子,比如PolicyServer和Authress。
【讨论】:
以上是关于在 Keycloak 中使用 OpenID Connect 的两个用例有啥区别? (客户端与应用程序)的主要内容,如果未能解决你的问题,请参考以下文章
Keycloak, openId-connect userInfo
使用 jumbojett/OpenID-Connect-PHP 库的 KeyCloak 身份验证流程