#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
, обмен токенами начал работать.
На самом деле, с точки зрения безопасности это имеет смысл. Только эмитент токена должен иметь возможность использовать его для получения информации о пользователе.