curl - key 斗篷错误 : code already used for userSession

标签 curl keycloak openid-connect

我正在尝试使用 Keycloak 处理 OIDC(标准)身份验证流程。使用 Keycloak docker 图像 quay.io/keycloak/keycloak:latest (18.0.0) 启动时没有额外的配置(没有数据库或任何东西)。我想要的是完全执行 this 中的步骤邮政;我已经在浏览器中导航到我的本地 Keycloak /auth 端点,登录,并将代码发送到我在客户端设置中指定的重定向 url (http://localhost:9000/)。但是,在“交换访问 token 的授权代码”步骤中,我不断收到 Keycloak 的响应,内容为 {"error":"invalid_grant","error_description":"Code not valid"}。 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

谷歌搜索让我找到了 this帖子,这看起来与我遇到的问题完全相同。但是,尝试对该发帖者的解决方案进行不同的变体都没有用。

注意:我能够使用grant_type=password 类型将负载发送到Keycloak 的/token 端点,但这不是我想。我需要能够复制 grant_type=authorization_code 流程。此外,由于某些原因,我不想使用隐式流程——我需要遍历标准流程。

有没有人可以看到发生了什么并指出我的解决方案?非常感谢。

编辑:为了回应 Jan Garaj 的评论,我将尽可能多地添加有关我已采取的步骤的详细信息...

  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. 按照步骤创建领域、用户和客户端 here ,将客户端“根 URL”更改为 http://localhost:9000/

  2. 将客户端的“访问类型”更改为 secret 。所有其他设置均保留为默认设置。 (我不知道到底什么是相关的,但下面的设置看起来很...???)

  • 客户端协议(protocol):openid-connect
  • 访问类型: secret
  • 启用标准流程:true
  • 启用隐式流:false
  • 启用直接访问权限:true
  • 身份验证流程覆盖:未修改

(还有什么……?)

  1. 在终端中,启动nc -l 9000

  2. 在浏览器中,导航到 http://localhost:8080/realms/myrealm/protocol/openid-connect/auth?client_id=myclient&response_type=code&state=fj8o3n7bdy1op5;使用用户名和密码登录。

  3. 在终端中,查看(尝试)使用授权码从 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. 在另一个终端:
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 取 self 的客户端的凭据 View 。这会导致上面粘贴的错误响应和日志输出。

我尝试过的变体:

  • 手动对重定向 uri 进行 url 编码
  • 从负载中删除 redirect_uri 字段到 /token
  • 以上所有使用 Keycloak v15.0.2(与上面链接中的版本相同)
  • 使用 httpbin.org 代替 localhost:9000

最佳答案

https://openid.net/specs/openid-connect-core-1_0.html#TokenRequestValidation

Ensure that the redirect_uri parameter value is identical to the redirect_uri parameter value that was included in the initial Authorization Request. If the redirect_uri parameter value is not present when there is only one registered redirect_uri value, the Authorization Server MAY return an error (since the Client should have included the parameter) or MAY proceed without an error (since OAuth 2.0 permits the parameter to be omitted in this case).

您的授权请求没有指定重定向 URI,但您的 token 请求指定了重定向 URI,因此在这种情况下,授权服务器(在这种特殊情况下为 Keycloak)返回了一个错误。

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

关于curl - key 斗篷错误 : code already used for userSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72282569/

相关文章:

c# - 包含访问 token 时如何从客户端应用程序中的 IdentityServer 获取用户 ID?

curl - 移动聚合 ElasticSearch

spring - Keycloak 和 Spring Boot 身份验证错误

kubernetes - 通过Keycloak登录ArgoCD后出现"Invalid return_url"(错误请求400)

authentication - 使用 Keycloak-proxy 进行 Zabbix HTTP 身份验证

security - OpenID Connect - 使用 JWT 使用 REST API 进行身份验证的带有 Javascript 应用程序的隐式流

ruby-on-rails - Ruby/Rails 性能 : OpenURI vs NET:HTTP vs Curb vs Rest-Client

r - 使用R自动下载数据

unix - 如何通过 wget 或 curl 访问 https 页面?

javascript - 使用 Open ID 与身份验证代码流连接 Azure AD