OAuth2AuthenticationToken не был распознан в getAccount JHipster 6.0.1 - PullRequest
0 голосов
/ 04 июня 2019

У меня есть собственный Android-клиент с аутентификацией OAuth2 для моего монолитного приложения JHipster. Он работал правильно с версией JHipster 5.7.2, но сейчас я использую версию 6.0.1, и я не смог получить текущего пользователя с помощью метода getAccount(Principal principal) в классе AccountResource. объект, отправленный keycloak, не является экземпляром класса OAuth2AuthenticationToken, поэтому я получаю Exception "User could not be found"

В предыдущей версии я использовал объект OAuth2Authentication, который работал нормально. Объект, который я имел обыкновение получать, был таким:

{
  "storedRequest": {
    "resourceIds": [

    ],
    "authorities": [

    ],
    "approved": true,
    "responseTypes": [

    ],
    "extensions": {

    },
    "clientId": "web_app",
    "scope": [

    ],
    "requestParameters": {

    }
  },
  "userAuthentication": {
    "principal": "Admin Administrator",
    "credentials": "N/A",
    "authorities": [
      {
        "role": "ROLE_USER"
      }
    ],
    "details": {
      "sub": "f348bbbb-9441-4543-9940-9da31e50d877",
      "email_verified": true,
      "roles": [
        "offline_access",
        "ROLE_ADMIN",
        "uma_authorization"
      ],
      "name": "Admin Administrator",
      "preferred_username": "admin",
      "given_name": "Admin",
      "family_name": "Administrator",
      "email": "admin@localhost"
    },
    "authenticated": true
  },
  "authorities": [
    {
      "role": "ROLE_USER"
    }
  ],
  "details": {
    "remoteAddress": "192.168.0.14",
    "tokenValue": "eyJhbGciOiJ...",
    "tokenType": "Bearer",
    "display": "remoteAddress\u003d192.168.0.14, tokenType\u003dBearertokenValue\u003d\u003cTOKEN\u003e"
  },
  "authenticated": true
}

Здесь объект, который я сейчас получаю в версии 6.0.1:

  "token": {
    "headers": {
      "kid": "w4uKMWW49GwLl-gakp9tAo6su7nAdddpo9Ul1pYABJo",
      "typ": "JWT",
      "alg": "RS256"
    },
    "claims": {
      "sub": "f348bbbb-9441-4543-9940-9da31e50d877",
      "resource_access": {
        "web_app": {
          "roles": [
            "ROLE_USER",
            "ROLE_ADMIN"
          ]
        },
        "account": {
          "roles": [
            "manage-account",
            "manage-account-links",
            "view-profile"
          ]
        }
      },
      "email_verified": true,
      "allowed-origins": [
        "*"
      ],
      "iss": "http://192.168.0.12:9080/auth/realms/jhipster",
      "typ": "Bearer",
      "preferred_username": "admin",
      "given_name": "Admin",
      "aud": [
        "web_app",
        "account"
      ],
      "acr": "0",
      "nbf": {
        "seconds": 0,
        "nanos": 0
      },
      "realm_access": {
        "roles": [
          "offline_access",
          "ROLE_ADMIN",
          "uma_authorization"
        ]
      },
      "azp": "android_app",
      "auth_time": 1559622495,
      "scope": "openid profile email jhipster",
      "name": "Admin Administrator",
      "exp": {
        "seconds": 1559622877,
        "nanos": 0
      },
      "session_state": "6c756fb9-c335-4a23-9c50-ed5adeb42456",
      "iat": {
        "seconds": 1559622577,
        "nanos": 0
      },
      "family_name": "Administrator",
      "jti": "6fe0962c-18c1-471e-b4c0-ad3afda12b46",
      "email": "admin@localhost"
    },
    "tokenValue": "eyJhbG...",
    "issuedAt": {
      "seconds": 1559622577,
      "nanos": 0
    },
    "expiresAt": {
      "seconds": 1559622877,
      "nanos": 0
    }
  },
  "authorities": [
    {
      "role": "SCOPE_openid"
    },
    {
      "role": "SCOPE_profile"
    },
    {
      "role": "SCOPE_email"
    },
    {
      "role": "SCOPE_jhipster"
    }
  ],
  "details": {
    "remoteAddress": "192.168.0.14"
  },
  "authenticated": true
}

Я ожидаю, что полученный объект Principal будет экземпляром OAuth2AuthenticationToken. Любое предложение?

1 Ответ

0 голосов
/ 04 июня 2019

Ну, я понял, что получаемый объект был JwtAuthenticationToken, поэтому я сделал некоторые изменения в методе getAccount(), чтобы добиться цели при получении токена такого типа.Я также добавляю новую опцию параметров для getUserFromAuthentication() при получении JwtAuthenticationToken.

@GetMapping("/account")
    @SuppressWarnings("unchecked")
    public UserDTO getAccount(Principal principal) {
        if (principal instanceof OAuth2AuthenticationToken) {
            return userService.getUserFromAuthentication((OAuth2AuthenticationToken) principal);
        } else if (principal instanceof JwtAuthenticationToken) {
            return userService.getUserFromAuthentication((JwtAuthenticationToken) principal);
        } else {
            throw new AccountResourceException("User could not be found");
        }
    }
public UserDTO getUserFromAuthentication(JwtAuthenticationToken principal) {
        Map<String, Object> attributes = principal.getToken().getClaims();
        User user = getUser(attributes);
        Map<String, Object> resourceAccess = (Map<String, Object>) principal.getToken().getClaims().get("resource_access");
        JSONObject webApp = (JSONObject) resourceAccess.get("web_app");
        JSONArray roles = (JSONArray) webApp.get("roles");
        user.setAuthorities(roles.stream().map(authority -> {
            Authority auth = new Authority();
            auth.setName(authority.toString());
            return auth;
        }).collect(Collectors.toSet()));
        return new UserDTO(syncUserWithIdP(attributes, user));

    }
...