Keycloak API总是返回401错误

19

我正在尝试通过Keycloak的REST API进行交互。我拥有主域、默认管理员用户和一个测试域。首先,我为管理员帐户和测试域获取访问令牌:

let data = {
    grant_type : 'password',
    client_id : 'test-realm',
    username : 'admin',
    password : 'admin'
};
let headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
};
axios.post(
    'https://someurl.com:8080/auth/realms/master/protocol/openid-connect/token',
    qs.stringify(data),
    headers
)

那个可以正常工作。然后我尝试调用创建用户(或进行其他任何操作),但是我收到了401未经授权的错误:

headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Authorization': `Bearer ${accessToken}`
};
data = {
    rep: {
        email: "test@email.com",
        username: "test@email.com"
    },
    path: 'test-realm'
};
axios.post('https://someurl.com:8080/auth/admin/realms/test-realm/users',
    qs.stringify(data),
    headers
)

那不是正确的包含令牌的方式吗?访问令牌是您用于验证其他 API 调用的令牌吗?管理员帐户的令牌不应该用于验证对主域中其他客户端的调用吗?这是否是我必须在管理员控制台中更改主域中的某些设置?任何帮助都将不胜感激。


我在使用Spring Boot时遇到了同样的问题。这个SO线程帮助我找出了问题:https://dev59.com/r7Xna4cB1Zd3GeqPPK8N - K. Siva Prasad Reddy
6个回答

17

1
谢谢,就这些。 - Abdelmjid EL KIHEL
2
我们遇到了这个问题,我猜测你的keycloak:8080是一个容器化的keycloak。事实证明,如果启用Frontend_Url,您可以使用它,但取决于您如何执行此操作,路径可能会在重定向URL上删除/auth/等内容。https://github.com/keycloak/keycloak-containers/blob/master/server/README.md#specify-frontend-base-url - abenbot
1
每天都有英雄存在..谢谢托比亚斯! - Viktor Stoitschev

11

那不是正确的包含令牌的方式吗?

这是一个正确的方式。

你只是做错了一些事情。 请参考 keycloak-request-token Node.js 模块中的示例:

https://github.com/keycloak/keycloak-request-token/blob/master/index.js#L43

你使用的是

client_id : 'test-realm'

但是还存在某些东西。

client_id: 'admin-cli' 

你好。

此外,要创建用户,您应该使用

'Content-Type': 'application/json'

您可以在此处查看 Keycloak REST API 的 Node.js 示例:

https://github.com/v-ladynev/keycloak-nodejs-example/blob/master/lib/adminClient.js

同样的项目中还有其他有用的示例,例如:

  • 自定义登录
  • 将 Keycloak 令牌存储在 cookie 中
  • 集中式权限中间件

在相同的项目中可以找到这些示例:keycloak-nodejs-example


{btsdaf} - Jayce444
它能工作,但为什么我不能使用另一个客户端? - Matteo
嗯,我尝试使用自定义客户端的机密流程,它可以工作,但是公共流程不行。 - Matteo

4
我通过在admin-cli的设置下启用下面的"启用服务帐户"按钮来修复了它。 输入图像描述

4

我的问题是客户端认证被设置为true,一旦我将其更改为false,它就可以工作了。 在此输入图像描述


3

我曾遇到过这个问题,通过确保第一次和第二次API请求之间不超过1分钟来解决了它。因此,如果您是手动执行这个过程(进行2个curl请求),令牌可能会过期,并且您可能会收到401错误。无论如何,建议使用上述的admin-cli。


2

最近我遇到了这个问题,经过一番努力,我发现当使用包含空格的领域名称与SDK或API交互时,会触发401未经授权的错误。

总之: 将:领域名称 更改为:realm-name


当同时操作两个领域时,这些建议并不实用。我使用Keycloak管理多个应用程序,并为每个应用程序设置一个领域。 - barfoos

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