如何从Keycloak机密客户端获取令牌?

4

对于前端React,我使用ReactKeycloakProvider作为一种要求用户登录的方式,然后令牌应该从'keycloak-js'存储到Keycloak中。

    <ReactKeycloakProvider 
      authClient={MYKEYCLOAK} 
      initOptions={{onLoad: 'login-required'}}
    >
      <BrowserRouter>
        <MainRouter />
      </BrowserRouter>
    </ReactKeycloakProvider>

对于 Keycloak,我正在使用 Keycloak v.20.0.2,客户端访问类型设置为机密,因为这是必需的,客户端验证器是客户端 ID 和密码。

问题在于,在用户登录后,我无法获取令牌,会出现 401 错误:

    {
       "error":"unauthorized_client",
       "error_description":"Invalid client or Invalid client credentials"
     }

然而,我期望成功获取令牌。

我已将访问类型设置为公共,然后成功检索到令牌。但是,当我将其设置为机密时,会出现401错误。因此,我认为这是因为我没有将客户端秘钥放入keycloak对象中。

另外,尝试使用keycloak.json将客户端秘钥放入keycloak配置中,像这样:

import Keycloak from 'keycloak-js';
const KEYCLOAK = new Keycloak('/keycloak.json');

但是只有当 .json 文件放置在公共文件夹中时才能被识别,这很奇怪,并且会导致无限循环。

3个回答

12

我的问题是客户端认证被设置为true,一旦我将其更改为false,它就可以正常工作。请参见下图: enter image


兄弟,你救了我一命。我已经像个疯子一样四天了,试图弄清楚我做错了什么。在我幸福的无知中,我在早期的Keycloak设置中启用了这个选项,以为这样可以让用户输入他们的凭据。我感觉像只愚蠢的鸡一样...我读了这么多关于所有这些客户端类型的文章,但是我无法弄清楚我做错了设置。你有我的支持。谢谢! - undefined
有趣的是,我正在使用授权码+PKCE,所以我不需要客户端授权 :D。基本上,你的回答似乎有另一个目的,但它让我能够再次检查我的设置。干杯! - undefined

1
如果您正在开发类似于React的前端应用程序,则应使用公共客户端。请参阅此处的Keycloak文档:

https://www.keycloak.org/docs/20.0.5/securing_apps/index.html#_javascript_adapter

关于使用客户端应用程序的一个重要事项是,客户端必须是公共客户端,因为没有安全的方式来存储客户端凭据在客户端应用程序中。这使得非常重要的是要确保为客户端配置的重定向URI是正确的和尽可能具体的。
要使用JavaScript适配器,您必须首先在Keycloak管理控制台中为您的应用程序创建一个客户端。确保选择了Access Type的public选项。您可以通过关闭客户端身份验证切换来在Capability配置中实现此目标。

0
如果在向Keycloak发出API请求时添加了错误的URL,则可能会收到“unauthorized_client”错误,其中包含“Invalid client or Invalid client credentials”的消息。
要解决此问题,请确保在API请求中使用了Keycloak服务器的正确URL。您可以在Keycloak管理控制台下的Realm Settings> General>“Issuer URL”中找到您的Keycloak服务器的正确URL。 https://usw2.auth.ac/auth/realms/{your-realm}/protocol/openid-connect/token/ 一旦您获得了正确的URL,请使用新的URL更新您的API请求并重试。这应该解决“unauthorized_client”错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接