作为 Keycloak 的新手,我尝试使用“密码”授权类型配置客户端。我知道在大多数情况下这不是首选解决方案。
我创建了一个领域“realm2”,其中包含客户端“myclient2”和用户。
尝试使用 Postman 获取令牌时,出现此错误:
{ "error": "unauthorized_client", "error_description": "Client secret not provided in request" }
当我添加 client_secret 时,我得到了令牌。我尝试提供用户名和密码,但没有透露任何秘密。
通过 Keycloak 用户界面,我还可以在“realm2”中以“johan”身份登录。
这是我在 Postman 中的请求:
在 Keycloak 中,我配置了“realm2”,没有设置任何特殊属性:
客户端“myclient2”是:
我可以在客户端的“凭据”选项卡上看到:
我在realm2中配置了1个用户,仅使用“password”作为密码:
如何配置我的 Keycloack 设置,这样我不需要“秘密”,而是需要用户名和密码?
您可以禁用客户端的身份验证,将其公开。您可以通过关闭客户端设置选项卡下的“客户端身份验证”来完成此操作。
编辑:我刚刚意识到你的钥匙斗篷版本似乎与我的不同。此配置可能位于设置选项卡中的
Access Type
选择器下,将其从 confidential
更改为 public
@Haf 的回答很切中要点; TL;DR: 在客户端
Access Type
下拉菜单中选择 public 而不是 confidential。
尽管如此,自从您指出以来,我想在幕后添加更多信息:
作为 Keycloack 的新手,我尝试使用以下命令配置客户端 “密码”授予类型。
首先,你应该知道Keycloak实现了OpenID Connect,这
根据 OAuth 2.0 协议,客户端可以是 confidential 或 public。
主要区别在于应用程序是否能够 安全地保存凭证(例如客户端 ID 和机密)。
关于机密客户:
有了这些知识,您就可以轻松地弄清楚如何创建没有客户端密钥的客户端。因为他们使用受信任的后端服务器,机密应用程序 可以使用要求他们通过指定进行身份验证的授权类型 调用令牌端点时的客户端 ID 和客户端密钥。
curl --location --request POST 'http://keycloak:8080/auth/realms/<your-realm>/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'audience=<your-client-id>' \
--data-urlencode 'username=sys' \
--data-urlencode 'password=12345678' \
--data-urlencode 'scope=openid' \
--data-urlencode 'client_id=<your-client-id>'
为了保密,请添加 client_secret:
curl --location --request POST 'http://keycloak:8080/auth/realms/<your-realm>/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'audience=<your-client-id>' \
--data-urlencode 'username=sys' \
--data-urlencode 'password=12345678' \
--data-urlencode 'scope=openid' \
--data-urlencode 'client_id=<your-client-id>' \
--data-urlencode 'client_secret=<your-client-secret>'
注意:在我的例子中,client_id 和 client_secret 也可以使用 HTTP 基本身份验证:
curl --location --request POST 'http://earth.eastnets.com:8080/auth/realms/eastnets/protocol/openid-connect/token' \
--header 'Authorization: Basic YW1sY2xpZW50OmFtbHNlY3JldA==' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'audience=<your-client-id>' \
--data-urlencode 'username=sys' \
--data-urlencode 'password=12345678' \
--data-urlencode 'scope=openid'
要验证密码*您需要配置直接授予的默认身份验证流程(/身份验证/流程)以要求密码,更改将对所有客户端全局生效:否则,将流程复制到新名称,例如 Direct Grant Strict,编辑该名称并覆盖特定客户端的直接授权的身份验证流程,如下所示,在客户端配置中: