Обмен скрытыми токенами завершается с ошибкой «invalid_token»

#oauth #keycloak #openid-connect #openid

#oauth #keycloak #OpenID-connect #OpenID

Вопрос:

У меня есть два экземпляра Keycloak, запущенных локально. Они подключены через OIDC. Пока все работает — я могу войти в систему через любой из экземпляров Keycloak.

Теперь я пытаюсь настроить обмен токенами, и он завершается ошибкой «invalid_token». Я хочу выполнить обмен токенами «внешний- внутренний». Существуют следующие журналы Keycloak, показывающие, что Keycloak отправляет HTTP-запрос GET с токеном, который я предоставил другому экземпляру Keycloak для получения информации о пользователе:

 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]"
 

Странная часть заключается в следующем: когда я отправляю тот же ответ с 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"}
 

Все разрешения для обмена токенами настроены (в противном случае запрос вообще не отправляется, и он завершается ошибкой с другой ошибкой).

Чего мне здесь не хватает? Любая помощь приветствуется.

Ответ №1:

Я понял это. Он работал с использованием curl, потому что я использовал localhost , и он не работал в Keycloak, потому Keycloak что использовал локальный IP-адрес ( 192.168.X.X ). Основная причина заключается в токене, который должен быть обменен. Поле iss должно соответствовать IP / хосту, который отправляет запрос. Другими словами, в токене, который я использовал для тестирования обмена токенами, iss было равно http://localhost... , и я также использовал localhost в запросе curl. После использования токена, который был выпущен 192.168.XX , обмен токенами начал работать.

На самом деле, с точки зрения безопасности это имеет смысл. Только эмитент токена должен иметь возможность использовать его для получения информации о пользователе.