Keycloack - 通过密码 grantType 获取 accessToken - 需要 client_secret

问题描述 投票:0回答:3

作为 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 设置,这样我不需要“秘密”,而是需要用户名和密码?

keycloak
3个回答
2
投票

您可以禁用客户端的身份验证,将其公开。您可以通过关闭客户端设置选项卡下的“客户端身份验证”来完成此操作。

编辑:我刚刚意识到你的钥匙斗篷版本似乎与我的不同。此配置可能位于设置选项卡中的

Access Type
选择器下,将其从
confidential
更改为
public


0
投票

@Haf 的回答很切中要点; TL;DR: 在客户端

Access Type
下拉菜单中选择 public 而不是 confidential

尽管如此,自从您指出以来,我想在幕后添加更多信息:

作为 Keycloack 的新手,我尝试使用以下命令配置客户端 “密码”授予类型。

首先,你应该知道Keycloak实现了OpenID Connect,这

是 OAuth 2.0 协议之上的简单身份层。

根据 OAuth 2.0 协议,客户端可以是 confidentialpublic

主要区别在于应用程序是否能够 安全地保存凭证(例如客户端 ID 和机密)。

关于机密客户:

因为他们使用受信任的后端服务器,机密应用程序 可以使用要求他们通过指定进行身份验证的授权类型 调用令牌端点时的客户端 ID 和客户端密钥。

有了这些知识,您就可以轻松地弄清楚如何创建没有客户端密钥的客户端。


0
投票
对于公共客户端,请指定 client_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,编辑该名称并覆盖特定客户端的直接授权的身份验证流程,如下所示,在客户端配置中:

© www.soinside.com 2019 - 2024. All rights reserved.