我正在尝试使用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服务器记录输出:
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的评论的回应,我将尽可能多地详细介绍我所采取的步骤.
$ docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:latest start-dev
http://localhost:9000/。confidential。所有其他设置都保留为默认设置。(我不知道到底什么是相关的,但下列设置似乎如此.??)(还有什么.?)
nc -l 9000http://localhost:8080/realms/myrealm/protocol/openid-connect/auth?client_id=myclient&response_type=code&state=fj8o3n7bdy1op5;使用用户名和密码登录。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
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是从我的客户的凭据视图中提取的。这将导致上面粘贴的错误响应和日志输出。
我试过的变体:
redirect_uri字段从有效负载移到/token发布于 2022-05-19 08:11:44
确保redirect_uri参数值与初始授权请求中包含的redirect_uri参数值相同。如果只有一个已注册的redirect_uri值时不存在redirect_uri参数值,则授权服务器可能返回一个错误(因为客户端应该包含该参数),或者可以不带错误地进行操作(因为OAuth 2.0允许省略该参数)。
您的请求没有指定重定向URI,但是您的令牌请求指定了,因此在本例中授权服务器(这种情况下的Keycloak)返回了一个错误。
解决方案:在auth请求中指定具有正确值的redirect_uri参数。
发布于 2022-05-19 21:42:02
嗯,看来我问题的根源仅仅是时间。当我浏览原问题中发布的步骤时,我是通过键入curl命令、复制粘贴代码等来实现的。我构建了一个小型web服务器,它执行问题中描述的相同步骤,并且这个过程工作得很好!所以,我想他们并没有开玩笑,当他们说说一个临时代码的有效期是“非常短的”(“授权代码流”第2节)!或者说我是一个比我想象的还要慢的打字员!在这篇文章中,我想知道是否有一种方法可以在Keycloak (?)中调整这个持续时间。
非常感谢@JanGaraj花时间建议解决问题。
https://stackoverflow.com/questions/72282569
复制相似问题