Keycloak API 总是 returns 401

Keycloak API always returns 401

我正在尝试通过其 REST API 与 Keycloak 进行交互。我有主域和默认管理员用户,以及一个测试域。首先,我获得了管理员帐户和测试领域的访问令牌:

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 调用的令牌吗?管理员帐户的令牌不应该用于验证对具有主域的其他客户端的调用吗?我必须在管理控制台中更改主领域中的某些设置吗?任何帮助表示赞赏。

Is that not the correct way to include the token?

这是正确的方法。

你只是做错了什么。 请参考 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'

您可以在此处参考 Node.js Keycloak REST API 示例:

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

其他有用的例子,例如:

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

可以在同一个项目中找到:keycloak-nodejs-example

我收到 401 错误,因为我使用 http://localhost:8080 and then I tried to request the api by using http://keycloak:8080 生成了离线令牌,这是不允许的。不幸的是日志没有告诉你。

为了调试 JWT 令牌,我推荐 https://jwt.io/

我遇到了这个问题,并通过确保第一个和第二个 API 请求之间的间隔不超过 1 分钟来解决它。因此,如果您手动执行此操作(2 个 curl 请求),则令牌可能会过期并且您可能会收到错误 401。不过,您应该如上所述使用 admin-cli。

我通过在 admin-cli 设置下启用下面的“启用服务帐户”按钮来修复它