我有一个关于keycloak如何与没有GUI访问权限的客户端一起工作的问题。
基本上我有:
- 配置了领域、客户端(访问类型为“机密”)和用户的keycloak服务器。 - 具有GUI的服务器应用程序,也提供API,并使用keycloak进行安全保护(客户端、用户等)。
这已经可以工作了,因为我能够在GUI上登录,进行重定向等操作。
甚至访问API也很好用,当我可以访问GUI时:我登录我的UI,按照重定向并让我的UI显示token。 然后人类(区别于应用程序的用户)可以在任何API客户端中使用该token。
在这种情况下,用户从未看到客户端秘密,这本能地是正确的方法。(请注意,我非常愿意听取别人告诉我我的直觉是错误的!)
但迄今为止我无法找到服务器应用程序(没有GUI)可以获取有效令牌的方式?
据我所理解,授权终点需要客户端ID和客户端秘密才能获得令牌,这是我宁愿避免的:我不认为将我的客户端秘密提供给所有“客户”是正确的方式。
或者,我可以在我的客户端上创建一个API,要求用户凭据并代表其请求令牌,但这会将客户端凭据暴露给我的应用程序,这违反了整个概念!
我尝试将客户端访问类型设置为公共,但是当我使用下面的API调用时,也会发生错误:
有人知道这应该怎么做吗?
提前感谢。
Max
基本上我有:
- 配置了领域、客户端(访问类型为“机密”)和用户的keycloak服务器。 - 具有GUI的服务器应用程序,也提供API,并使用keycloak进行安全保护(客户端、用户等)。
这已经可以工作了,因为我能够在GUI上登录,进行重定向等操作。
甚至访问API也很好用,当我可以访问GUI时:我登录我的UI,按照重定向并让我的UI显示token。 然后人类(区别于应用程序的用户)可以在任何API客户端中使用该token。
在这种情况下,用户从未看到客户端秘密,这本能地是正确的方法。(请注意,我非常愿意听取别人告诉我我的直觉是错误的!)
但迄今为止我无法找到服务器应用程序(没有GUI)可以获取有效令牌的方式?
据我所理解,授权终点需要客户端ID和客户端秘密才能获得令牌,这是我宁愿避免的:我不认为将我的客户端秘密提供给所有“客户”是正确的方式。
或者,我可以在我的客户端上创建一个API,要求用户凭据并代表其请求令牌,但这会将客户端凭据暴露给我的应用程序,这违反了整个概念!
我尝试将客户端访问类型设置为公共,但是当我使用下面的API调用时,也会发生错误:
POST /auth/realms/realmname/protocol/openid-connect/tokenAPI
'grant_type=client_credentials'
'client_id=client_id'
'username=username'
'password=password'
{
"error": "unauthorized_client",
"error_description": "Public client not allowed to retrieve service account"
}
有人知道这应该怎么做吗?
提前感谢。
Max