Задать вопрос
  • Как реализовать spring oauth2 OIDC backchannel logout?

    devpav
    @devpav Автор вопроса
    Full-Stack разработчик.
    Мне пришлось на стороне поставщика OIDC (spring-oauth2-server) реализовать:

    • Session Event Management. Контроль по событиям session. (created, delete, expire)
    • При выходе пользователя или истечения действия сессия получать данные о subject и запрашивать авторизации OAuth2AuthorizationService (где хранится информация о registred-client)
    • Получать информацию об OidcIdToken / получать информацию о sid
    • Прохожу по всем авторизациям subject собирая информацию
    • После, по полученным авторизациям формиировать Jwt (logout_token) и запрашивать разлогин у клиентов по /logout/connect/back-channel/{registrationId}. Информацию о back-channel endpoint получаю из redirectUrls registredClient.
    • Так как spring предоставляет
      oidcLogoutSpec.backChannel { }
      (для oidc потребителей) то back-channel event dispatcher реализую через REST
    Ответ написан
    Комментировать
  • Как заставить работать интернационализацию в ErrorResponse методах?

    devpav
    @devpav
    Full-Stack разработчик.
    public static final String I18_BUNDLE_LOCATION = "language/messages";
        
    @Bean
        public ResourceBundleMessageSource resourceBundleMessageSource() {
            final var source = new ResourceBundleMessageSource();
            {
                source.setBasename(I18_BUNDLE_LOCATION);
                source.setDefaultEncoding(StandardCharsets.UTF_8.name());
            }
    
            return source;
        }

    66fb3970b8230342940738.png
    @Slf4j
    @Service
    @RequiredArgsConstructor
    public class LocaleI18Service implements LocaleService {
    
        private final ResourceBundleMessageSource messageSource;
    
        @Override
        public String getI18Message(final String i18Code) {
            return getMessage(i18Code, Map.of());
        }
    
        public String getI18Message(final String i18Code, final Map<String, String> args) {
            return getMessage(i18Code, args);
        }
    
        private String getMessage(final String i18Code, final Map<String, String> args) {
            if (Objects.isNull(i18Code)) {
                return null;
            }
    
            final var currentLocale = LocaleContextHolder.getLocale();
    
            final String template = messageSource.getMessage(i18Code, null, currentLocale);
    
            if (Objects.isNull(args) || args.isEmpty()) {
                return template;
            }
    
            return StringSubstitutor.replace(template, args, "{", "}");
        }
    }


    66fb3a32a3346675588143.png

    public interface SystemException {
    
        /**
         * Get args for code
         *
         * @return args message
         */
        Map<String, String> getArgs();
    
        /**
         * Exception code
         *
         * @return i18 code
         */
        String getI18Code();
    
    }


    66fb3aa70b97e285459437.png
    Ответ написан
    Комментировать
  • Как сделать правильный редирект в Nginx с разными SPA index.html?

    devpav
    @devpav Автор вопроса
    Full-Stack разработчик.
    Получается, что index.html (React) лежат в двух разных директориях.
    /home/html/admin/index.html;
    /home/html/index.html

    location /ws {
            proxy_pass $BACKEND_URL;
            proxy_http_version 1.1;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    
         location / {
            root /home/html/admin/;
            try_files $uri /index.html;
         }
    
         location /interview {
            root /home/html/;
            try_files $uri $uri/index.html;
         }
    Ответ написан
  • Как лучше хранить пароли на компьютере клиента?

    devpav
    @devpav
    Full-Stack разработчик.
    Если Вы имеете сервер, то посмотрите в сторону JWT. На основе пароля и соли (ключевое слово) генерировать токен (с ключевым словом которое знает только сервер), который позволит получать информацию о пользователе Вашей системы по этому токену, привязываете к пользователю текущий токен (при желании можно делать срок годности токена).

    1. Не хранить пароли в открытом виде.
    2. Не хранить пароли на стороне пользователя (если есть сервер).
    3. Смешивать пароль с ключевым (Вашим) словом приложения (добавлять соль) и шифровать.
    4. Желательно использовать пароль только для log in, а при получении токена использовать только его.
    Ответ написан
  • Как реализовать загрузку изображения в галерею?

    devpav
    @devpav
    Full-Stack разработчик.
    Если native js тогда через createElement создавай нужную структуру блока

    <div>
     <img src="// добавь путь полученный с сервера после загрузки">
    </div>

    Получи набор элементов (изображений) first-child и вставь в галерею перед полученным элементом.

    var elementFirst = document.querySelector('div img:first-child');
    divGallery.insertBefore(newElemnt, elementFirst);
    Ответ написан
    Комментировать
  • Как настроить проксирование в nginx нескольких приложений?

    devpav
    @devpav
    Full-Stack разработчик.
    Привет.

    5d8b1ce6b9047946336749.png

    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    events {
           worker_connections  1024;
    }
    
    http {
          include       mime.types;
          default_type  application/octet-stream;
    
          #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
          #                  '$status $body_bytes_sent "$http_referer" '
          #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
          #access_log  logs/access.log  main;
    
          sendfile        on;
          #tcp_nopush     on;
    
          #keepalive_timeout  0;
          keepalive_timeout  65;
          send_timeout 300;
          proxy_read_timeout 300;
          proxy_connect_timeout 300;
    
          gzip  on;
          gzip_vary on;
          gzip_min_length 10240;
          gzip_proxied expired no-cache no-store private auth;
          gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/json;
    
          server {
            listen 80;
    
            if ($scheme = https) {
                return 301 http://$host$request_uri;
            }
          }
    
          server {
                listen 80;
    
                server_name localhost ************ 127.0.0.1;
    
                add_header Last-Modified $date_gmt;
                add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
                if_modified_since off;
                expires off;
                etag off;
    
                location / {
                   root /usr/share/nginx/html/;
                   index index.html;
                }
    
                location /api {
                    proxy_pass http://rest:8080/api;
                    proxy_set_header Host $host:$server_port;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-for $remote_addr;
                    proxy_redirect off;
                }
          }
    }


    Прочти:
    nginx.org/ru/docs/beginners_guide.html
    Ответ написан
    Комментировать
  • Как работает цикл while?

    devpav
    @devpav
    Full-Stack разработчик.
    Привет. Прикольно. Люблю когда пишут сразу boolean isExit = false; и следующим действием while(!isExit).
    Должен работать без проблем, но можно изменить чуть чуть.

    while (!isExit) //пока isExit правда, то

    пока isExit ложь Вы хотели сказать, а !isExit правда.
    Ответ написан
    2 комментария
  • Как подключить ресурсы assets в библиотеку Angular 8?

    devpav
    @devpav Автор вопроса
    Full-Stack разработчик.
    Короче, если ресурсом являются svg изображения, то создаём собственный компонент администрирующий их и используем по библиотеке. можно вставлять напрямую svg. Не знаю насколько способ верный, но он мне подошел по следующим причинам: не нужно использовать иные библиотеки для иконок и покрывает все мои нужды.
    Ответ написан
    Комментировать
  • Как правильно заархитектурить экшен NGRX с двумя логическими шагами?

    devpav
    @devpav
    Full-Stack разработчик.
    Добавь логику в сам класс Action.
    Обычно для каждого actions создают свой класс.

    interface Navigate {
     currentItem: number;
     items: number[]
    }
    export class NavigateToFirst implements Action {
      readonly type =  NavigateActions.CHANGE_Navigate;
      public payload: Navigate;
      constructor(navigate: Navigate) {
             // change 
            this.payload = navigate;
      }
    }
    Ответ написан
  • Как добавить новый элемент в ассоциативный массив?

    devpav
    @devpav
    Full-Stack разработчик.
    Друг мой. Зачем Вы делаете это? 2 часа времени и все вопросы такого рода навсегда отпадут.
    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Ответ написан
    2 комментария
  • Где брать макеты для react приложений?

    devpav
    @devpav
    Full-Stack разработчик.
    https://reactstrap.github.io/components/alerts/
    Что Вы имеете в виду под названием "макет"?
    Ответ написан
  • Как отобразить только нужное значение из результата поиска?

    devpav
    @devpav
    Full-Stack разработчик.
    userLogin.get(db.rows[i].LOGIN).Id
    Очень странный поиск на самом деле.
    Возможно ошибку допустили из-за маленького, но важного аспекта "именование переменных".
    Ответ написан
    Комментировать