keycloak - 用户通过身份验证后的 CODE_TO_TOKEN_ERROR

Posted

技术标签:

【中文标题】keycloak - 用户通过身份验证后的 CODE_TO_TOKEN_ERROR【英文标题】:keycloak - CODE_TO_TOKEN_ERROR after user is authenticated 【发布时间】:2018-02-02 06:13:24 【问题描述】:

我正在使用 nodeJS keycloak 适配器,到目前为止,我的客户端应用程序正在重定向到 keycloak 登录。

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

12:07:12,341 WARN [org.keycloak.events](默认任务 30) type=CODE_TO_TOKEN_ERROR,realmId=myrealm,clientId=client-test, userId=xxx, ipAddress=xxx.xxx.xxx.xx, 错误=无效代码,授权类型=授权代码, code_id=xxx, client_auth_method=client-secret

发送回我的快速应用程序的错误消息显示为“无法获得授权代码”。

有人能解释一下这到底是什么意思吗?我只能认为我在我的领域\客户端\用户设置中配置了一些错误。

谢谢

【问题讨论】:

【参考方案1】:

我找到了解决方案。似乎如果您遵循本指南:https://www.ibm.com/developerworks/library/se-oauthjavapt3/index.html,您将看到当您交换访问令牌的访问代码时(/realms/realm-name/protocol/openid-connect/token),您需要添加相同的redirect_uri 在请求访问代码时使用。它现在对我有用。

希望对你有帮助,

阿德里安

【讨论】:

嗨阿德里安,你能解释一下在哪里添加redirect_uri吗?我将它作为查询参数添加到用于获取访问令牌的 url,但错误保持不变。 我已将其添加为查询参数。也许这对您有用,而其他原因会导致您的问题。 @mindparse 您能否将此答案标记为所需的答案?谢谢。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

在我将新的代理 idp 添加到我的 keycloak 配置后,我遇到了相同的 CODE_TO_TOKEN_ERROR。当对令牌端点的 POST 请求正文中的某些参数错误时,Keycloak 会返回该错误。在我的例子中,我调查了我的参数值,我意识到在我的应用程序中错误地将一个散列字符(即 #)附加到那个称为代码的参数的值上。删除该哈希解决了该错误。

在您的情况下,您的 POST 请求正文中的任何参数都可能有错误 代码授权流程中的参数如下:grant_type、client_id、client_secret、code、scope和redirect_uri。 但是,根据实施的流程,它们可能会有所不同。

在客户端应用程序中从 Keycloak 作为对代码授予授权请求的响应而发送的重定向 URL 中接收到诸如“代码”之类的参数。 url 的语法有时会略有不同。我意识到哈希字符只能在某些情况下附加到 url 的末尾。 url解析需要处理所有情况。

【讨论】:

以上是关于keycloak - 用户通过身份验证后的 CODE_TO_TOKEN_ERROR的主要内容,如果未能解决你的问题,请参考以下文章

在 keycloak 中跳过 kerberos sso 身份验证

从外部源向 Keycloak 身份验证添加其他角色

KeyCloak 在身份验证代码流错误后重定向回身份提供者

Keycloak 使用不同的客户端重新验证经过身份验证的用户

如何检查来自另一个 keycloak 实例 B 的身份验证 keycloak 实例 A 用户?

移动应用程序 + REST 后端中的 OpenID Connect 身份验证流程(使用 KeyCloak)