Извлечение пользовательских данных Keycloak с использованием полученного токена доступа - PullRequest
0 голосов
/ 10 сентября 2018

Я занимаюсь разработкой WildFly-Backend (на Java), который принимает HTTP-запросы (из пользовательского внешнего интерфейса), которые подписаны токеном доступа носителя Keycloak пользователя через HTTP-заголовок «Authorization».

Само соединение Backend уже защищено с помощью адаптера Keycloak для WildFly, но внутренне я хочу проверить, кто является пользователем (группы пользователей, имя и т. Д.) И вернуть те же ответы.

Я подумал, что можно будет просто отправить эти данные из внешнего интерфейса, но тогда люди могут легко подделать запрос, когда у них будет токен доступа. Есть ли способ получить такие данные, как пользовательские данные, имея только токен доступа?

1 Ответ

0 голосов
/ 10 сентября 2018

С тех пор я разобрался, как решить проблему!

Сначала добавьте в верхнюю часть класса следующее:

@Context
SecurityContext securityContext;

Это будет введено в контексте безопасности сервера. Чтобы это работало с Keycloak, WildFly должен иметь установленный адаптер Wildfly и web.xml должен быть настроен для использования Keycloak.

Прежде чем мы продолжим, нам нужна библиотека Keycloak-Core, например, на Maven:

<!-- https://mvnrepository.com/artifact/org.keycloak/keycloak-core -->
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-core</artifactId>
    <version>4.4.0.Final</version>
</dependency>

4.4.0.Final была последней версией на момент написания этого ответа; Рекомендуется использовать либо последнюю версию, либо версию, которая соответствует версии сервера Keycloak.

Далее, в точке, где вы хотите получить информацию о пользователе, вы получаете UserPrincipal:

if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
    KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());

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

Из приведенного KeycloakPrinciple извлеките KeycloakSecurityContext и оттуда токен пользователя:

AccessToken token = principal.getKeycloakSecurityContext().getToken();

В некоторых случаях (в зависимости от версии вашего Keycloak и / или WildFly) getToken () может возвращать ноль. В этих случаях используйте getIdToken ():

IDToken token = principal.getKeycloakSecurityContext().getIdToken();

AccessToken расширяет IDToken, поэтому у вас есть полная функциональность (для этого контекста) в обоих случаях.

Из токена могут быть извлечены все пользовательские данные. В качестве примера мы получаем имя пользователя пользователя. В Keycloak это свойство называется «предпочтительным именем пользователя».

String user = token.getPreferredUsername();

И все готово! Ваш полный код теперь может выглядеть так:

if (securityContext != null && securityContext.getUserPrincipal() instanceof KeycloakPrincipal) {
    KeycloakPrincipal principal = ((KeycloakPrincipal) securityContext.getUserPrincipal());
    AccessToken token = principal.getKeycloakSecurityContext().getToken();
    // IDToken token = principal.getKeycloakSecurityContext().getIdToken();

    System.out.println("User logged in: " + token.getPreferredUsername());
} else {
    System.out.println("SecurityContext could not provide a Keycloak context.");
}
...