Keycloak 令牌交换失败并出现 "invalid_token" 错误
Keycloak token exchange fails with "invalid_token" error
我在本地有两个 Keycloak 实例 运行。它们通过 OIDC 连接。到目前为止一切正常——我可以通过任何 Keycloak 实例登录。
现在我正在尝试设置 token exchage,但失败并显示“invalid_token”错误。我想进行“外部到内部”令牌交换。以下 Keycloak 日志显示 Keycloak 使用我提供给另一个 Keycloak 实例的令牌发送 HTTP GET 请求以获取用户信息:
08:14:36,523 DEBUG http-outgoing-19 >> "GET /auth/realms/master/protocol/openid-connect/userinfo HTTP/1.1[\r][\n]"
08:14:36,523 DEBUG http-outgoing-19 >> "Authorization: Bearer eyJhbGciOiJSU...[\r][\n]"
响应是 401:
08:14:36,530 DEBUG http-outgoing-19 << "HTTP/1.1 401 Unauthorized[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "X-XSS-Protection: 1; mode=block[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "X-Frame-Options: SAMEORIGIN[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "Referrer-Policy: no-referrer[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "Date: Tue, 24 Nov 2020 08:14:36 GMT[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "Connection: keep-alive[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "WWW-Authenticate: Bearer realm="master", error="invalid_token", error_description="Token verification failed"[\r][\n]"
奇怪的部分是:当我使用在 Keycloak 中不起作用的相同令牌向 curl
发送相同的响应时 - 它有效:
curl -X GET 'http://localhost:8050/auth/realms/master/protocol/openid-connect/userinfo' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1N...'
{"name":"r o","sub":"fff41a6f-6910-4419-8d46-7630b57ed420","email_verified":true,"preferred_username":"ttt","given_name":"r","family_name":"o"}
设置令牌交换的所有权限(否则它根本不发送请求并且失败并出现另一个错误)。
我在这里错过了什么?非常感谢任何帮助。
我明白了。它使用 curl 工作,因为我使用的是 localhost
,它在 Keycloak 中不起作用,因为 Keycloak
使用本地 IP 地址(192.168.X.X
)。核心原因在于必须交换的令牌。字段 iss
必须与发送请求的 IP/Host 匹配。换句话说,在我用来测试token exchange的token中,iss
等于http://localhost...
,我在curl请求中也使用了localhost
。使用从 192.168.XX
颁发的令牌后,令牌交换开始工作。
实际上,从安全的角度来看,这是完全有道理的。只有令牌的发行者才能使用它来获取用户信息。
我在本地有两个 Keycloak 实例 运行。它们通过 OIDC 连接。到目前为止一切正常——我可以通过任何 Keycloak 实例登录。
现在我正在尝试设置 token exchage,但失败并显示“invalid_token”错误。我想进行“外部到内部”令牌交换。以下 Keycloak 日志显示 Keycloak 使用我提供给另一个 Keycloak 实例的令牌发送 HTTP GET 请求以获取用户信息:
08:14:36,523 DEBUG http-outgoing-19 >> "GET /auth/realms/master/protocol/openid-connect/userinfo HTTP/1.1[\r][\n]"
08:14:36,523 DEBUG http-outgoing-19 >> "Authorization: Bearer eyJhbGciOiJSU...[\r][\n]"
响应是 401:
08:14:36,530 DEBUG http-outgoing-19 << "HTTP/1.1 401 Unauthorized[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "X-XSS-Protection: 1; mode=block[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "X-Frame-Options: SAMEORIGIN[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "Referrer-Policy: no-referrer[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "Date: Tue, 24 Nov 2020 08:14:36 GMT[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "Connection: keep-alive[\r][\n]"
08:14:36,530 DEBUG http-outgoing-19 << "WWW-Authenticate: Bearer realm="master", error="invalid_token", error_description="Token verification failed"[\r][\n]"
奇怪的部分是:当我使用在 Keycloak 中不起作用的相同令牌向 curl
发送相同的响应时 - 它有效:
curl -X GET 'http://localhost:8050/auth/realms/master/protocol/openid-connect/userinfo' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1N...'
{"name":"r o","sub":"fff41a6f-6910-4419-8d46-7630b57ed420","email_verified":true,"preferred_username":"ttt","given_name":"r","family_name":"o"}
设置令牌交换的所有权限(否则它根本不发送请求并且失败并出现另一个错误)。
我在这里错过了什么?非常感谢任何帮助。
我明白了。它使用 curl 工作,因为我使用的是 localhost
,它在 Keycloak 中不起作用,因为 Keycloak
使用本地 IP 地址(192.168.X.X
)。核心原因在于必须交换的令牌。字段 iss
必须与发送请求的 IP/Host 匹配。换句话说,在我用来测试token exchange的token中,iss
等于http://localhost...
,我在curl请求中也使用了localhost
。使用从 192.168.XX
颁发的令牌后,令牌交换开始工作。
实际上,从安全的角度来看,这是完全有道理的。只有令牌的发行者才能使用它来获取用户信息。