首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >密钥披风错误:已经用于userSession的代码

密钥披风错误:已经用于userSession的代码
EN

Stack Overflow用户
提问于 2022-05-18 02:24:38
回答 2查看 1K关注 0票数 3

我正在尝试使用Keycloak获得OIDC (标准)身份验证流的句柄。使用quay.io/keycloak/keycloak:latest (18.0.0)图像启动时没有额外的配置(没有数据库或其他任何东西)。我想要的是准确地完成 post中的步骤;我已经在浏览器中导航到本地Keycloak /auth端点,登录,并将代码发送到我在客户端设置(http://localhost:9000/)中指定的重定向url。但是,在“将授权代码转换为访问令牌”的步骤中,我一直从读取{"error":"invalid_grant","error_description":"Code not valid"}的Keycloak获得响应。Keycloak服务器记录输出:

代码语言:javascript
复制
2022-05-18 01:22:35,906 WARN  [org.keycloak.protocol.oidc.utils.OAuth2CodeParser] (executor-thread-48) Code '193bfcc4-6e24-45f9-bc36-222ee3f0839b' already used for userSession '2b17e705-3821-42cb-819d-204245e38527' and client '282cfa97-627d-48ac-9656-8e0a2aaa198a'.
2022-05-18 01:22:35,906 WARN  [org.keycloak.events] (executor-thread-48) type=CODE_TO_TOKEN_ERROR, realmId=myrealm, clientId=myclient, userId=null, ipAddress=172.17.0.1, error=invalid_code, grant_type=authorization_code, code_id=2b17e705-3821-42cb-819d-204245e38527, client_auth_method=client-secret

谷歌把我推到了上,这看起来和我遇到的问题完全一样。然而,在这张海报的解决方案上尝试不同的变化都是徒劳的。

注意:我可以用/token类型将有效负载发送到Keycloak的grant_type=password端点,但这不是我想要的。我需要能够复制grant_type=authorization_code流。另外,出于一些原因,我不想使用隐式流--我需要遍历标准流。

有没有人能看到正在发生的事情,并指出我的解决方案?在此之前,非常感谢您。

编辑:作为对Jan的评论的回应,我将尽可能多地详细介绍我所采取的步骤.

  1. 从Docker映像启动Keycloak:

$ docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev

  1. 按照这里步骤创建领域、用户和客户端,将客户端“根URL”更改为http://localhost:9000/
  2. 将客户端的“访问类型”更改为confidential。所有其他设置都保留为默认设置。(我不知道到底什么是相关的,但下列设置似乎如此.??)
  • 客户端协议:openid-连接
  • 访问类型:机密
  • 启用标准流:真
  • 隐式流启用: false
  • 启用直接访问授权:真
  • 身份验证流重写:未修改

(还有什么.?)

  1. 在终端中,启动nc -l 9000
  2. 在浏览器中,导航到http://localhost:8080/realms/myrealm/protocol/openid-connect/auth?client_id=myclient&response_type=code&state=fj8o3n7bdy1op5;使用用户名和密码登录。
  3. 在终端中,请参见(尝试)用auth代码从Keycloak重定向。

GET /?state=fj8o3n7bdy1op5&session_state=5216ae35-89f6-4a42-a39a-b5545ff05c37&code=2ed44e9c-dc71-4ac1-9953-0e6e86f2a82d.5216ae35-89f6-4a42-a39a-b5545ff05c37.650fb336-8b0f-4e13-b2d8-725e188eea39

  1. 在另一个航站楼:
代码语言:javascript
复制
curl -v --location -X POST -H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code' \
-d 'client_id=myclient' \
-d 'client_secret=b0B430pRlfAs1rFurAqUKEmxkPTBptnh' \
-d 'code=2ed44e9c-dc71-4ac1-9953-0e6e86f2a82d.5216ae35-89f6-4a42-a39a-b5545ff05c37.650fb336-8b0f-4e13-b2d8-725e188eea39' \
-d 'redirect_uri=http://localhost:9000/' \
http://localhost:8080/realms/myrealm/protocol/openid-connect/token

其中client_secret是从我的客户的凭据视图中提取的。这将导致上面粘贴的错误响应和日志输出。

我试过的变体:

  • 手动url-编码重定向uri
  • redirect_uri字段从有效负载移到/token
  • 以上所有内容都使用Keycloak v15.0.2 (与上面链接中的版本相同)
  • 使用httpbin.org而不是localhost:9000
EN

回答 2

Stack Overflow用户

发布于 2022-05-19 08:11:44

0.html#TokenRequestValidation

确保redirect_uri参数值与初始授权请求中包含的redirect_uri参数值相同。如果只有一个已注册的redirect_uri值时不存在redirect_uri参数值,则授权服务器可能返回一个错误(因为客户端应该包含该参数),或者可以不带错误地进行操作(因为OAuth 2.0允许省略该参数)。

您的请求没有指定重定向URI,但是您的令牌请求指定了,因此在本例中授权服务器(这种情况下的Keycloak)返回了一个错误。

解决方案:在auth请求中指定具有正确值的redirect_uri参数。

票数 1
EN

Stack Overflow用户

发布于 2022-05-19 21:42:02

嗯,看来我问题的根源仅仅是时间。当我浏览原问题中发布的步骤时,我是通过键入curl命令、复制粘贴代码等来实现的。我构建了一个小型web服务器,它执行问题中描述的相同步骤,并且这个过程工作得很好!所以,我想他们并没有开玩笑,当他们说说一个临时代码的有效期是“非常短的”(“授权代码流”第2节)!或者说我是一个比我想象的还要慢的打字员!在这篇文章中,我想知道是否有一种方法可以在Keycloak (?)中调整这个持续时间。

非常感谢@JanGaraj花时间建议解决问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72282569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档