Keycloak API 总是返回 401

Posted

技术标签:

【中文标题】Keycloak API 总是返回 401【英文标题】:Keycloak API always returns 401 【发布时间】:2018-04-03 14:28:39 【问题描述】:

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

【问题讨论】:

我在使用 SpringBoot 时遇到了同样的问题。这个 SO 线程帮助我解决了问题***.com/questions/57477407/… 【参考方案1】:

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

这是正确的方法。

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

其他有用的例子:

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

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

【讨论】:

谢谢,adminClient.js 有效!我只是使用了他们的功能并使用了 keycloak-admin-client NPM 模块,我可以创建和删除用户等。 它可以工作,但为什么我不能使用另一个客户端? 嗯,我已经尝试在自定义客户端中使用机密流程,它可以正常工作,但不能用于公共【参考方案2】:

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

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

【讨论】:

谢谢,就这样 我们遇到了这个问题,我猜你的 keycloak:8080 是一个容器化的 keycloak。事实证明,如果启用 Frontend_Url,您可以使用它,但取决于您的操作方式,路径可能会在您的重定向 URL 等上删除 /auth/。github.com/keycloak/keycloak-containers/blob/master/server/… 日常英雄仍然存在..谢谢托拜厄斯!【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Keycloak API 总是返回 401的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net Core 3 API 总是返回 401- JwtBearer

当我尝试通过 keycloak 调用我的安全 API 时收到状态 401 Unauthorized

Keycloak PUT 请求返回 401(未经授权)

对于未经身份验证的请求,Keycloak spring boot 返回 403 而不是 401

我收到状态 401 错误:当我尝试通过 keycloak 调用我的 Secured API 时未授权

每当我发送包含 Bearer 令牌的请求时,ASP.Net Core API 总是返回 401 未授权