Keycloak 令牌交换失败并出现“invalid_token”错误

rkm*_*rkm 2 openid oauth openid-connect keycloak

我有两个本地运行的 Keycloak 实例。它们通过 OIDC 连接。到目前为止一切正常 - 我可以通过任何 Keycloak 实例登录。

现在我正在尝试设置令牌交换,但失败并出现“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]"
Run Code Online (Sandbox Code Playgroud)

响应是 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]"
Run Code Online (Sandbox Code Playgroud)

奇怪的部分是这样的:当我curl使用在 Keycloak 中不起作用的相同令牌发送相同的响应时 - 它起作用了:

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"}
Run Code Online (Sandbox Code Playgroud)

设置令牌交换的所有权限(否则它根本不会发送请求,并且会因另一个错误而失败)。

我在这里缺少什么?非常感谢任何帮助。

rkm*_*rkm 9

我想到了。它使用curl工作,因为我使用的是localhost,并且它在Keycloak中不起作用,因为Keycloak使用本地IP地址(192.168.X.X)。核心原因在于必须交换的代币。字段iss必须与发送请求的 IP/主机匹配。换句话说,在我用来测试令牌交换的令牌中,iss是 equal http://localhost...,并且我也在localhostcurl请求中使用了。使用 发行的代币后192.168.XX,代币兑换开始工作。

事实上,从安全角度来看,这是完全有道理的。只有令牌的发行者才应该能够使用它来获取用户信息。