Keycloak API始终返回401

Jay*_*444 5 api https unauthorized access-token keycloak

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

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
)
Run Code Online (Sandbox Code Playgroud)

没关系。然后,我尝试拨打电话来创建用户(或执行其他任何操作),然后收到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
)
Run Code Online (Sandbox Code Playgroud)

这不是包含令牌的正确方法吗?访问令牌是您用来认证其他API调用的令牌吗?管理员帐户的令牌不应该用于通过主领域验证对其他客户端的呼叫吗?我必须在管理控制台中更改主领域中的某些设置吗?任何帮助表示赞赏。

Tob*_*nst 17

我收到 401 错误,因为我使用http://localhost:8080生成脱机令牌,然后尝试使用http://keycloak:8080请求 api ,这是不允许的。不幸的是日志没有告诉你这一点。

要调试 JWT 令牌,我建议使用https://jwt.io/

  • 我们遇到了这个问题,我猜您的 keycloak:8080 是一个容器化的 keycloak。事实证明,如果启用 Frontend_Url,您就可以使用它,但根据您的操作方式,该路径可能会在您的重定向网址上删除 /auth/ 等。https://github.com/keycloak/keycloak-containers/blob/master/server/ README.md#specify-frontend-base-url (2认同)

小智 7

我的问题是客户端身份验证设置为 true ,一旦我将其更改为 false ,它就起作用了 在此输入图像描述


v.l*_*nev 5

这不是包含令牌的正确方法吗?

这是正确的方法。

您只是做错了什么。请参考keycloak-request-tokenNode.js模块中的示例:

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

你用

client_id : 'test-realm'
Run Code Online (Sandbox Code Playgroud)

但是还有

client_id: 'admin-cli' 
Run Code Online (Sandbox Code Playgroud)

在那里(不知道有没有关系)。

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

'Content-Type': 'application/json'
Run Code Online (Sandbox Code Playgroud)

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

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

其他有用内容的示例,例如:

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

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