Я пишу приложение, которое использует keycloak в качестве службы аутентификации пользователя. У меня есть обычные пользователи, которые входят в Keycloak из внешнего интерфейса (веб-браузеры), и пользователи служб, которые входят в систему из внутреннего интерфейса (PHP в IIS). Однако, когда я вхожу в систему из бэкэнда, keycloak использует HS256 в качестве алгоритма подписи для токена доступа и, таким образом, отклоняет его для дальнейшего взаимодействия, поскольку RS256 установлен в области и в настройках клиента. Чтобы обойти эту проблему, я хотел бы «притвориться внешним интерфейсом», чтобы получить подписанные токены доступа RS256 для моих пользователей службы.
По соображениям безопасности я не могу передать ключ HS256 серверу приложений, поскольку он симметричен, и слишком много людей могут получить доступ к коду сервера.
В настоящее время я отлаживаю проблему, используя один и тот же идентификатор пользователя / pw / client id / grant как на интерфейсе, так и на сервере, так что это не может быть проблемой .
Пока что я безуспешно пробовал:
- копирование пользовательского агента
- копирование каждого отдельного HTTP-заголовка (Host, Accept, Content-Type, User-Agent, Accept-Encoding, Connection, даже Content-Length такие же, как и данные формы)
- двойная проверка, успешен ли вход в keycloak или нет - это так, просто он использует неправильный алгоритм подписи
Так как же keycloak определяет, с каким алгоритмом подписывать токены? Если он отличается от версии к версии, где я должен искать ответ в коде keycloak?
EDIT: разъяснение потока входа в систему и причин, почему бэкэнд его обрабатывает.
Если пользователь входит в журнал in, вот что происходит:
- клиент - [данные для входа] -> сервер keycloak
- сервер keycloak - [доступ и обновление sh токена с прямым предоставлением токена ] -> клиент
- клиент - [токен доступа] -> сервер приложений
- (сервер приложений проверяет токен доступа)
- сервер приложений - [данные] - -> client
Но в некоторых случаях data пятого шага - это список пользователей, которые существуют в моей области. Проблема в том, что keycloak требует, чтобы у одного была роль view-users для перечисления пользователей, которая существует только в главной области, поэтому я не могу использовать токен зарегистрированного пользователя для получить его. В этом случае я создал специального пользователя службы в главной области с ролью просмотр-пользователи и получил следующие данные:
- клиент - [запрашивает список пользователей] -> сервер приложений
- сервер приложений - [данные для входа в систему пользователя службы] -> сервер keycloak
- сервер keycloak - [токен доступа с прямым предоставлением] -> сервер приложений
- сервер приложений - [токен доступа] -> сервер keycloak получить конечную точку API списка пользователей
- (сервер приложений фильтрует подробные данные пользователей только в список имен пользователей)
- сервер приложений - [список пользователей] -> клиент
Это делает список имен пользователей фактически опубликованным c, но все остальные данные остаются скрытыми от клиентов - и по соображениям безопасности / конфиденциальности я хочу сохранить это таким образом, поэтому я не могу просто поместить данные для входа в систему пользователя службы в переменную JS на интерфейсе.
В последнем list, шаг 4 является неудачным, поскольку шаг 3 возвращает подписанный маркер доступа HS256. В предыдущем списке шаг 2 правильно возвращает маркер доступа, подписанный RS256.