private UserIdentity createAuthFlowUserIdentity(final JwtClaims jwtClaims,
                                                    final HttpServletRequest request,
                                                    final TokenResponse tokenResponse,
                                                    final User user) {
        Objects.requireNonNull(user);
        final HttpSession session = request.getSession(false);

        final UpdatableToken updatableToken = new UpdatableToken(
                tokenResponse,
                jwtClaims,
                super::refreshUsingRefreshToken,
                session);

        final UserIdentity userIdentity = new UserIdentityImpl(
                user.getUuid(),
                user.getSubjectId(),
                user.getDisplayName(),
                user.getFullName(),
                session,
                updatableToken);

        updatableToken.setUserIdentity(userIdentity);
        addTokenToRefreshManager(updatableToken);

        LOGGER.info(() -> "Authenticated user " + userIdentity
                          + " for sessionId " + NullSafe.get(session, HttpSession::getId));
        return userIdentity;
    }
External IDP users are identified by their subject which is a not very helpful UUID.
Therefore, we cache the preferred_username and full_name in the stroom user whenever the user
logs in, or hits the api. We have no way to request this information from the IDP prior to
them logging in though.
Each time we map their identity we check the cached info is up-to-date and if so update it.
stroom-security/stroom-security-impl/src/main/java/stroom/security/impl/StroomUserIdentityFactory.java