我正在使用 Keycloak 服务器来实施SSO。我可以使用 client_credentials 流程为特定客户端获取访问令牌。
但是,我的观察是,客户端的内部服务帐户授予了访问令牌。我希望通过向令牌端点提供一些附加参数,为领域中的其他用户获取访问令牌
以下是我使用 Postman Chrome扩展程序对令牌端点进行的当前请求:
POST http://localhost:8080/auth/realms/<realm>/protocol/<protocol>/token
x-www-form-urlencoded
grant_type client_credentials
client_id <client_id>
client_secret <client_secret>
如果可能,请告诉我。另外,我想传达的是 Keycloak 和 openid-connect 协议的新内容。
答案 0 :(得分:6)
我认为你在这里误解了一些Oauth概念。 client_credentials grant仅应用于服务本身以授予对特定资源的访问权限。想象一下这种情况:
最终用户 - &gt;文件服务 - &gt; Docs Repo
最终用户可以通过docs服务访问存储在repo中的一些文档。在这种情况下,服务决定授予用户对特定文档的访问权,因为repo仅仅是内容服务器。显然,它们都是通过两个不同的keycloak客户端来保护的。
但是,docs服务需要对repo具有完全访问权限。他可以访问他要求的任何文件。解决方案是为docs服务提供服务帐户角色,让我们说 DOC_MANAGER ,并在请求资源时对此角色进行repo检查。该服务使用 client_credentials 进行身份验证,并可以访问资源作为服务。
但最终用户将使用Authorization code flow执行标准登录,并通过该服务访问doc。该服务将检查另一个角色,让我们说 DOC_USER 并在进入回购之前检查用户是否有权访问此具体资源。
您可以阅读有关keycloak服务帐户here的更多信息。