Keycloak - 用户通过身份验证后出现CODE_TO_TOKEN_ERROR错误

31

我正在使用 nodeJS keycloak 适配器,目前可以让客户端应用程序重定向到 keycloak 登录页面。

在尝试登录时,我在 keycloak 日志中收到以下错误信息:

12:07:12,341 WARN [org.keycloak.events] (default task-30) type=CODE_TO_TOKEN_ERROR, realmId=myrealm, clientId=client-test, userId=xxx, ipAddress=xxx.xxx.xxx.xx, error=invalid_code, grant_type=authorization_code, code_id=xxx, client_auth_method=client-secret

我的 Express 应用程序收到的错误消息为“无法获取授权码”。

有人能否解释一下这具体是什么意思?我只能想到我可能在我的领域/客户端/用户设置中配置了不正确的内容。

谢谢!

5个回答

22
我找到了解决方案。看起来如果您按照这个指南:https://www.ibm.com/developerworks/library/se-oauthjavapt3/index.html,当您交换访问代码(access code)以获取访问令牌(access token)(/realms/{realm-name}/protocol/openid-connect/token)时,您需要添加相同的redirect_uri作为您请求访问代码时使用的那个。它对我有用。
希望对您有所帮助,
Adrian

2
嗨Adrian,你能解释一下在哪里添加redirect_uri吗?我将它作为查询参数添加到获取访问令牌的URL中,但错误仍然存在。 - Ridvan Sumset
我已将其添加为查询参数。也许这对你有用,而其他原因导致了你的问题。 - Adrian Madaras
@mindparse,您能否将此答案标记为所需的答案?谢谢。 - Adrian Madaras

8
重定向 URL 应完全相同。我使用以下重定向 URL 获取代码 http://example.com/frontend/。在获取令牌时,我使用以下 URL http://example.com/。对两个调用使用相同的 URL 解决了问题。

1
我在将新的委托IDP添加到我的Keycloak配置后遇到了相同的CODE_TO_TOKEN_ERROR。当POST请求体中的某个参数错误时,Keycloak会返回该错误。在我的情况下,我调查了参数值,并意识到一个简单的哈希字符(即#)错误地附加到名为code的参数值上。删除该哈希符号解决了此问题。
在您的情况下,可能是POST请求体中任何参数的错误。授权代码流程中的参数包括:grant_type、client_id、client_secret、code、scope和redirect_uri。但是,它们可以因实现的流程而异。
像“code”这样的参数从Keycloak作为对代码授权请求的响应发送的重定向的URL中在客户端应用程序中接收。有时URL的语法存在轻微差异。我意识到仅在某些情况下可以将哈希字符附加到URL的末尾。 URL解析需要处理所有情况。

你能分享更多关于你的问题的信息吗?就我而言,我遇到了完全相同的附加哈希符号。我正在开发一个.NET MAUI应用程序,在与Azure OIDC(还有Keycloak联合)交互时遇到了这个问题。 - undefined

1
这通常意味着发送给Keycloak以交换令牌的代码无效或丢失。首先查看类型为LOGIN的用户日志消息,并确保该消息中的代码与登录消息上的code_id匹配,与CODE_TO_TOKEN_ERROR上的code_id匹配。

0

如果您正在使用浏览器登录,则将客户端访问类型从“机密”更改为“公共”。机密需要在请求中提供密钥以启动登录协议。


你将会牺牲安全 :-(。每个登录案例都有自己的OIDC流程,nodejs服务器应用程序不应使用公共客户端。 - Jan Garaj
这是因为我说了“如果您正在使用浏览器登录”。如果您正在使用nuxt.js(即node.js),则需要将客户端访问设置为公共,因为对于前端而言,没有私有密钥。 - Piero
我有同样的问题-我收到了上述错误(unauthorized_client代码2003),因为客户端被设置为机密([x]客户端授权),但我的公共客户端(AppAuth库)没有发送客户端密码。取消勾选“客户端授权”后,问题得到解决。感谢提示! - hb0

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