Русский
Русский
English
Статистика
Реклама

Блог компании русфинанс банк

Как работают и отдыхают ИТ-специалисты в пост-карантин?

09.09.2020 10:06:55 | Автор: admin
В марте из-за пандемии COVID-19 Русфинанс Банк (РФБ) и целый ряд других компаний перешли на дистанционный режим работы. После снятия ограничений многие организации возвращаются к работе в офисе, однако РФБ и его ИТ-подразделение продолжает работать удалённо (подробнее о переходе на удалёнку можно прочитать тут).

Мы решили выяснить, как изменилась работа сотрудников после перехода в home office, и заодно познакомить вас с нашими ИТ-экспертами системными аналитиками, бизнес-аналитиками, разработчиками, тестировщиками.

Из интервью вы узнаете об их профессиональных предпочтениях и инструментарии, а также о том, какую литературу они читают, какими гаджетами пользуются и что думают о построении карьеры в ИТ-индустрии.

Первым нашим собеседником стал Андрей Фетисов, начальник отдела разработки систем взаимодействия с партнёрами (команда, отвечающая за сервисную прослойку между банком и внешним миром в части автокредитования), в прошлом системный аналитик и руководитель группы. Андрей серьёзный руководитель, но в свободное от работы время по-прежнему любит, среди прочего, поиграть в компьютерные игры или заняться написанием музыки.



Чем ты занимаешься в Русфинанс Банке? За что отвечаешь?

Я начальник отдела разработки систем, отвечающих за интеграцию с партнёрами в рамках процесса автокредитования. Мы разрабатываем сервисы для интеграции наших систем с внешним миром, начиная с форм для самостоятельной отправки анкеты клиентом через наши или партнёрский сайты и заканчивая брокерским софтом, CRM-системами партнёров. И, в целом, двигаем процесс оформления автокредитов всё дальше и дальше в онлайн.

До этого работал системным аналитиком, затем руководителем группы.

Опиши, пожалуйста, одним словом/ фразой (метафорой, эпитетом), твой девиз в работе.

Поспешишь людей насмешишь.

Какие гаджеты (компьютеры, планшеты, смартфоны) ты используешь в работе/ для личного пользования? Изменились ли они с переходом на удалёнку?

Рабочий ноутбук + домашний компьютер + смартфон + умные часы. С уходом на удалёнку ничего не поменялось. У меня смартфон Huawei Honor 8, исторически пользуюсь Androidом.

Какие операционные системы тебе нравится использовать вне работы? С какими OS было бы интересно познакомиться для себя? Почему интересны именно они?

Использую Windows 10, на *nix никогда не планировал переходить, так как иногда играю в игры, а в те времена, когда я начинал (~20 лет назад), было немало проблем с совместимостью, поэтому так и остался на Windows. И хотя сейчас хобби уже практически сошло на нет, так как перестало затягивать и цеплять, инерция сохранилась.

Изредка собираемся с друзьями на сессионные игры (аналоги настольных игр типа Armello или MOBA типа Heroes of the Storm). Из однопользовательских игр последними меня зацепили Persona 5, Cuphead, Disco Elysium и Horizon: Zero Dawn.

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

В целом для домашнего пользования мне достаточно Windows.
Скучаю по привычному Windows XP

Каким таск-менеджером/ таск-трекером ты пользуешься для работы/ для себя? Почему выбрал именно их?

У меня личного таск-менеджера как такового нет, рабочие дела записываю в физические/ электронные блокноты. Некоторые свои нерабочие дела веду в Google Keep отдельными заметками с перечнем планируемых действий.

В целом ретроградски предпочитаю что-то офлайновое, не завязанное на соединение с Интернетом. К сожалению, хотя сейчас уже далеко не 2000-е, когда половина сервисов имела открытую наружу админку со стандартными логинами/ паролями, и информационная безопасность сделала миллион шагов вперёд, утечки данных случаются в том числе и у крупных компаний. Мне бы не хотелось, чтобы это случилось с моими личными заметками (улыбается).

В рабочем процессе используем Jira. По завершении процесса Discovery (бизнес-анализ, исследование актуальности и окупаемости той или иной фичи) задача заводится в бэклоге Delivery (системный анализ, разработка, тестирование, внедрение). Задачу декомпозируем на подзадачи, берём в работу, включаем в нужный релиз. У типовой задачи будет движение между аналитиком, Oracle-разработчиком, Java-разработчиком, тестировщиком и менеджером приложения (роль, которая в том числе отвечает за внедрение).

В целом, наш подход такой, что по Jira должно быть чётко понятно, на каком этапе задача, у кого в работе, какие компоненты затрагивает, есть ли блокеры и что вообще в рамках задачи должно быть сделано. Цели спринта и приоритеты задач тоже проставляются в Jira, то есть разработчик в теории должен иметь возможность самостоятельно определить, к какой фиче ему нужно в данный момент прилагать усилия для успешного завершения спринта.

Не могу сказать, что мы на 100% с этим справляемся, но определённо движемся в этом направлении. У нас очень большая команда, и мы только учимся эффективно работать все вместе, поэтому предстоит огромное количество работы в том числе и над прозрачностью наших процессов.

Confluence мы преимущественно используем как базу знаний. Пока вопрос лицензий ещё не решён окончательно. Тем не менее, мы очень надеемся, что сможем собрать в единое удобное для чтения и редактирования место все знания, разбросанные по инструкциям, письмам, головам и так далее. Амбициозно рассчитываю стать одним из основателей процесса управления знаниями в компании (улыбается). Пока мы наполняем базу не слишком активно, так как контрибьютить могут не все участники команды.

Какие фреймворки, языки, IDE и другие инструменты тебе нравится использовать больше всего? Почему?

Сам разработкой не занимаюсь, с кодом работаю в основном в рамках чтения, написания проверочных скриптов. Для этих небольших нужд использую Pl/Sql developer.

Моделированием мы занимаемся не слишком часто, но когда необходимость возникает, использую Visio и Visio-совместимые приложения (например, draw.io).

Какое место в твоей жизни занимает тайм-менеджмент? Какие инструменты/ методики ты используешь для управления своим временем (если есть)?

За время карьеры делал несколько подходов к изучению и применению на практике различных методологий. Честно говоря, по моему мнению, для эффективного менеджмента рабочего времени необходимо, чтобы ежедневно у тебя было сколько-то этого самого времени для планирования (улыбается).

Рабочий график руководителя очень редко даёт возможность полноценно планировать более 3-4 часов в день. При этом, конечно же, речи нет о том, чтобы они шли подряд. Здесь критически важна автономность каждого сотрудника: чем больше вопросов команда может затащить самостоятельно (неважно, подключиться ли к решению критического бага с прода, не дожидаясь просьбы свыше, или самостоятельно найти и прочитать документацию по нужному административному вопросу), тем больше времени останется на те задачи, где моё участие и правда необходимо.

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

А для того, чтобы максимизировать эффективность работы над конкретной задачей, когда для неё наконец нашлось время, лучше всего, на мой взгляд, использовать метод помодорро (ставите таймер 15-25 минут на конкретную задачу и запускаете, это дисциплинирует). И тогда становится психологически сложнее отвлекаться на новые письма, сообщения в мессенджерах часики-то тикают.

Слушаешь ли ты что-то во время работы/ в перерывах между работой (музыку, аудиокниги и т.д.)? Была ли у тебя такая возможность/ желание до перехода на удалёнку?

В офисе (в open space) постоянно приходилось ставить музыку фоном, чтобы не отвлекаться и сосредоточиться на работе. На удалёнке наоборот: в основном пользуюсь возможностью спокойно сосредоточиться в полной тишине, музыку включаю только под настроение, для творческих задач, вроде ответов на вопросы данного интервью (улыбается).

Какую профессиональную литературу ты читаешь? Что можешь порекомендовать?

Для аналитиков, только начинающих профессиональный путь, полезными будут Разработка требований к программному обеспечению Вигерса и Современные методы описания функциональных требований к системам Коберна.

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

Как ИТ-специалисту, перешедшему в менеджеры, мне помогла немного лучше понять происходящее книга От разработчика до руководителя Камиля Фурнье.

Какие полезные профессиональные привычки помогают тебе в работе?

Всегда перепроверять любую свою работу (документацию, код) незамыленным взглядом после паузы.

Нет ничего обиднее, чем решить задачу на 90%, предусмотрев корректную работу сложных технических моментов, а потом попасться на мелочах или невнимательности. Завершив долгую работу есть большое искушение поставить точку и сказать я закончил и взять следующую интересную задачу, но, как бы тяжело и неприятно не было заниматься вычитыванием сделанного, это необходимо.

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

Какой важный совет, который ты когда-либо получал, можешь передать начинающим специалистам в твоей профессиональной области?

Если брать системный анализ, я бы сформулировал два:

1. Всегда старайтесь узнать чуть больше, как в технической, так и бизнесовой части.

Эта эрудиция сэкономит вам и вашей команде в будущем очень много времени и ресурсов. Заказчик понимает, что он хочет, но не знает, как это лучше реализовать. Хотя может иметь своё видение, которое нельзя отбрасывать, так же, как и нельзя, не обдумав, использовать в качестве руководства к действию.

Разработчик хорошо понимает свою систему, но не всегда знает детали бизнес-процессов. Вы как аналитик должны на достаточном уровне понимать и одно, и другое. Какого уровня осведомлённости достаточно в вашей ситуации, станет понятно с набором опыта.

2. Не бойтесь задавать глупые вопросы.

На работе нет места гордости. На 1 из 10* глупых вопросов вы получите не тот ответ, который кажется очевидным.

*Статистика собрана эмпирическим путём

В целом важные на мой взгляд советы:

1. Не позволяйте себе по инерции вести спор ради того, чтобы отстоять свою точку зрения, а не найти правильный ответ. Если вас переубедят в каком-то вопросе, и вы примете чужую точку зрения, это не значит, что вы проиграли или показали некомпетентность. Лучше иметь репутацию человека, который умеет выслушивать чужое мнение и признавать свою неправоту (а значит, его совет и мнение действительно имеют ценность), чем изо всех споров всегда выходить победителем любой ценой, чтобы не дать слабину.

2. Совет, который мне давали мои руководители ещё в самом начале работы в РФБ, когда я был специалистом, а не менеджером. Тогда я к нему не прислушался, потому что он внутренне показался мне неверным. Я смог по-настоящему его оценить только на дистанции. Хотя обоих советовавших я безмерно уважал и уважаю. И в целом всегда старался следовать всем их рекомендациям.

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

Разрешите себе уйти в офлайн, сосредоточиться на своей задаче. Если случится что-то критичное вас обязательно найдут (улыбается). Давайте себе какое-то время (например, с утра и до обеда), в которое вы не реагируете на внешние раздражители. Даже на короткие вопросики на пять минут максимум.

Я думаю, что у каждого айтишника наберётся вагон и маленькая тележка ситуаций, в которой вам сообщили, что там что-то не работает, вы бросились читать логи, изучать документацию и реализацию, готовить тестовые кейсы для воспроизведения, сформулировали первые уточняющие вопросы, вернулись к инициатору, и услышали а оно уже заработало само.

Баги не самый удачный пример, конечно, но, тем не менее, немалое количество вопросов рассасываются самостоятельно в течение часа-двух по тем или иным причинам.

О самоизоляции


Один из важнейших выводов для меня по результатам изоляции то, что команде можно и нужно доверять ещё больше. Когда опыта удалённой работы нет, конечно же, грызёт мысль о том, насколько эффективно будет тратиться рабочее время.
Но выводы оказались контринтуитивными: времени на работу стало тратиться больше, когда нет этого офисного давления не поедешь домой прямо сейчас опоздаешь на электричку, встрянешь в пробку, будешь ехать домой не 50 минут, а 2 часа и так далее. Из-за этого вечно приходилось делать выбор между ещё полчасика, чтобы добить эту задачку и приехать домой засветло. Про количество подключений в нерабочее время (о которых не просит руководство, т.к. у нас это категорически не принято), я промолчу, отмечу лишь, что горжусь каждым членом своей команды и каждому благодарен.
Подробнее..

Как реализовать интеграцию с ЕСИА на Java без лишних проблем

04.12.2020 10:17:32 | Автор: admin
Долгое время основным способом идентификации граждан был обычный паспорт. Ситуация изменилась, когда в 2011 году по заказу Минкомсвязи была внедрена Единая система идентификации и аутентификации (ЕСИА), она позволила распознавать личность человека и получать о ней данные в режиме онлайн.

Благодаря внедрению ЕСИА государственные и коммерческие организации, разработчики и владельцы онлайн-сервисов получили возможность ускорить и сделать более безопасными операции, связанные с вводом и верификацией пользовательских данных. Русфинанс Банк также решил использовать потенциал системы и при доработке сервиса по оформлению кредита онлайн (банк специализируется на автокредитовании) реализовал интеграцию с платформой.

Сделать это оказалось не так просто. Нужно было выполнить ряд требований и процедур, решить технические трудности.

В данной статье мы постараемся рассказать про основные моменты и методические указания, которые важно знать тем, кто хочет самостоятельно реализовать интеграцию с ЕСИА, а также приведем фрагменты кода на языке Java, которые помогут преодолеть трудности при разработке (часть реализации опущена, но общая последовательность действий ясна).

Надеемся, наш опыт поможет Java-разработчикам (и не только) сэкономить массу времени при разработке и ознакомлении с методическими рекомендациями Минкомсвязи.



Зачем нам нужна интеграция с ЕСИА?


В связи с пандемией коронавируса количество офлайн сделок во многих направлениях кредитования начало сокращаться. Клиенты стали уходить в онлайн, и для нас было жизненно важно укрепить своё онлайн-присутствие на рынке автокредитования. В процессе доработки сервиса Автокредит (на Хабре уже есть статья про его разработку) мы решили сделать интерфейс заведения кредитных заявок на сайте банка максимально удобным и простым. Интеграция с ЕСИА стала ключевым моментом в решении этой задачи, поскольку позволила автоматически получить персональные данные клиента.



Для клиента такое решение также оказалось удобным, поскольку дало возможность использовать единый логин и пароль для регистрации и входа в сервис онлайн-одобрения заявок на приобретение автомобиля в кредит.

Кроме того, интеграция с ЕСИА позволила Русфинанс Банку:

  • сократить время заполнения онлайн-анкет;
  • уменьшить количество отказов пользователей при попытке заполнить большое количество полей вручную;
  • обеспечить поток более качественных, верифицированных клиентов.

Несмотря на то, что мы рассказываем об опыте нашего банка, информация может быть полезна не только финансовым организациям. Правительство рекомендует использовать платформу ЕСИА и для других видов онлайн-услуг (подробнее тут).

Что делать и как?


Сначала нам показалось, что в интеграции с ЕСИА нет ничего особенного с технической точки зрения стандартная задача, связанная с получением данных посредством REST API. Однако, при ближайшем рассмотрении стало понятно, что не всё так просто. Например, выяснилось, что у нас нет представления о том, как работать с сертификатами, необходимыми для подписи нескольких параметров. Пришлось тратить время и разбираться. Но обо всем по порядку.

Для начала важно было наметить план действий. Наш план включал следующие основные шаги:

  1. зарегистрироваться на технологическом портале ЕСИА;
  2. подать заявки на использование программных интерфейсов ЕСИА в тестовой и промышленной среде;
  3. самостоятельно разработать механизм взаимодействия с ЕСИА (в соответствии с действующим документом Методические рекомендации по использованию ЕСИА);
  4. протестировать работу механизма в тестовой и промышленной среде ЕСИА.

Обычно мы разрабатываем наши проекты на Java. Поэтому для программной реализации выбрали:

  • IntelliJ IDEA;
  • КриптоПро JCP (или КриптоПро Java CSP);
  • Java 8;
  • Apache HttpClient;
  • Lombok;
  • FasterXML/Jackson.

Получение URL для переадресации


Первый шаг это получение авторизационного кода. В нашем случае это делает отдельный сервис с переадресацией на страницу авторизации портала Госуслуг (расскажем об этом немного подробнее).

Сначала мы инициализируем переменные ESIA_AUTH_URL (адрес ЕСИА) и API_URL (адрес, на который происходит редирект в случае успешной авторизации). После этого создаем объект EsiaRequestParams, который содержит в своих полях параметры запроса к ЕСИА, и сформируем ссылку esiaAuthUri.

public Response loginByEsia() throws Exception {  final String ESIA_AUTH_URL = dao.getEsiaAuthUrl(); // Адрес ЕСИА  final String API_URL = dao.getApiUrl(); // Адрес, на который произойдет редирект с случае успешной авторизации  EsiaRequestParams requestDto = new EsiaRequestParams(API_URL);  URI esiaAuthUri = new URIBuilder(ESIA_AUTH_URL)          .addParameters(Arrays.asList(            new BasicNameValuePair(RequestEnum.CLIENT_ID.getParam(), requestDto.getClientId()),            new BasicNameValuePair(RequestEnum.SCOPE.getParam(), requestDto.getScope()),            new BasicNameValuePair(RequestEnum.RESPONSE_TYPE.getParam(), requestDto.getResponseType()),            new BasicNameValuePair(RequestEnum.STATE.getParam(), requestDto.getState()),            new BasicNameValuePair(RequestEnum.TIMESTAMP.getParam(), requestDto.getTimestamp()),            new BasicNameValuePair(RequestEnum.ACCESS_TYPE.getParam(), requestDto.getAccessType()),            new BasicNameValuePair(RequestEnum.REDIRECT_URI.getParam(), requestDto.getRedirectUri()),            new BasicNameValuePair(RequestEnum.CLIENT_SECRET.getParam(), requestDto.getClientSecret())          ))          .build();  return Response.temporaryRedirect(esiaAuthUri).build();}

Для наглядности покажем, как может выглядеть класс EsiaRequestParams:

public class EsiaRequestParams {  String clientId;  String scope;  String responseType;  String state;  String timestamp;  String accessType;  String redirectUri;  String clientSecret;  String code;  String error;  String grantType;  String tokenType;  public EsiaRequestParams(String apiUrl) throws Exception {    this.clientId = CLIENT_ID;    this.scope = Arrays.stream(ScopeEnum.values())            .map(ScopeEnum::getName)            .collect(Collectors.joining(" "));    responseType = RESPONSE_TYPE;    state = EsiaUtil.getState();    timestamp = EsiaUtil.getUrlTimestamp();    accessType = ACCESS_TYPE;    redirectUri = apiUrl + RESOURCE_URL + "/" + AUTH_REQUEST_ESIA;    clientSecret = EsiaUtil.generateClientSecret(String.join("", scope, timestamp, clientId, state));    grantType = GRANT_TYPE;    tokenType = TOKEN_TYPE;  }}

После этого нужно перенаправить пользователя на сервис аутентификации ЕСИА. Пользователь вводит свой логин-пароль, подтверждает доступ к данным для нашей системы. Далее ЕСИА отправляет онлайн-сервису ответ, в котором содержится код авторизации. Этот код понадобится для дальнейших запросов в ЕСИА.

Каждый запрос к ЕСИА имеет параметр client_secret, который представляет собой откреплённую электронную подпись в формате PKCS7 (Public Key Cryptography Standard). В нашем случае для подписи используется сертификат, который был получен удостоверяющим центром перед началом работ по интеграции с ЕСИА. Как работать с хранилищем ключей хорошо описано в этом цикле статей.

Для примера покажем, как выглядит хранилище ключей, предоставляемое компанией КриптоПро:



Вызов приватного и публичного ключей в этом случае будет выглядеть так:

KeyStore keyStore = KeyStore.getInstance("HDImageStore"); // Создание экземпляра хранилищаkeyStore.load(null, null);PrivateKey privateKey = (PrivateKey) keyStore.getKey(esiaKeyStoreParams.getName(), esiaKeyStoreParams.getValue().toCharArray()); // Получение приватного ключаX509Certificate certificate = (X509Certificate) keyStore.getCertificate(esiaKeyStoreParams.getName()); // Получение сертификата, он же  открытый ключ.

Где JCP.HD_STORE_NAME имя хранилища в КриптоПро, esiaKeyStoreParams.getName() имя контейнера и esiaKeyStoreParams.getValue().toCharArray() пароль контейнера.
В нашем случае не нужно загружать данные в хранилище методом load(), так как ключи уже будут там при указании имени этого хранилища.

Здесь важно помнить, что получения подписи в виде

final Signature signature = Signature.getInstance(SIGN_ALGORITHM, PROVIDER_NAME);signature.initSign(privateKey);signature.update(data);final byte[] sign = signature.sign();

нам недостаточно, так как ЕСИА требует откреплённую подпись формата PKCS7. Поэтому следует создать подпись формата PKCS7.

Пример нашего метода, возвращающего откреплённую подпись, выглядит следующим образом:

public String generateClientSecret(String rawClientSecret) throws Exception {    if (this.localCertificate == null || this.esiaCertificate == null) throw new RuntimeException("Signature creation is unavailable");    return CMS.cmsSign(rawClientSecret.getBytes(), localPrivateKey, localCertificate, true);  }

Здесь мы проверяем наличие нашего открытого ключа и открытого ключа ЕСИА. Так как метод cmsSign() может содержать конфиденциальную информацию, мы не будем его раскрывать.

Укажем лишь некоторые детали:

  • rawClientSecret.getBytes() байтовый массив scope, timestamp, clientId и state;
  • localPrivateKey приватный ключ из контейнера;
  • localCertificate публичный ключ из контейнера;
  • true булево значение параметра подписи открепленная или нет.

Пример создания подписи можно найти в java-библиотеке КриптоПро, там стандарт PKCS7 называется CMS. А также в руководстве программиста, которое лежит вместе с исходниками скаченной версии КриптоПро.

Получение токена


Следующий шаг получение маркера доступа (он же токен) в обмен на авторизационный код, который был получен в качестве параметра при успешной авторизации пользователя на портале Госуслуг.

Для получения каких-либо данных в ЕСИА нужно получить токен доступа. Для этого формируем запрос в ЕСИА. Основные поля запроса тут формируются аналогичным образом, в коде получается примерно следующее:

URI getTokenUri = new URIBuilder(ESIA_TOKEN_API_URL)        .addParameters(Arrays.asList(          new BasicNameValuePair(RequestEnum.CLIENT_ID.getParam(), requestDto.getClientId()),          new BasicNameValuePair(RequestEnum.CODE.getParam(), code),          new BasicNameValuePair(RequestEnum.GRANT_TYPE.getParam(), requestDto.getGrantType()),          new BasicNameValuePair(RequestEnum.CLIENT_SECRET.getParam(), requestDto.getClientSecret()),          new BasicNameValuePair(RequestEnum.STATE.getParam(), requestDto.getState()),          new BasicNameValuePair(RequestEnum.REDIRECT_URI.getParam(), requestDto.getRedirectUri()),          new BasicNameValuePair(RequestEnum.SCOPE.getParam(), requestDto.getScope()),          new BasicNameValuePair(RequestEnum.TIMESTAMP.getParam(), requestDto.getTimestamp()),          new BasicNameValuePair(RequestEnum.TOKEN_TYPE.getParam(), requestDto.getTokenType())        ))        .build();HttpUriRequest getTokenPostRequest = RequestBuilder.post()        .setUri(getTokenUri)        .setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded")        .build();

Получив ответ, распарсим его и получим токен:

try (CloseableHttpResponse response = httpClient.execute(getTokenPostRequest)) {  HttpEntity tokenEntity = response.getEntity();  String tokenEntityString = EntityUtils.toString(tokenEntity);  tokenResponseDto = extractEsiaGetResponseTokenDto(tokenEntityString);}

Токен представляет собой строку, состоящую из трёх частей и разделённых точками: HEADER.PAYLOAD.SIGNATURE, где:

  • HEADER это заголовок, имеющий в себе свойства токена, в том числе алгоритм подписи;
  • PAYLOAD это информация о токене и субъекте, которую запрашиваем у Госуслуг;
  • Signature это подпись HEADER.PAYLOAD.

Валидация токена


Для того, чтобы убедиться, что мы получили ответ именно от Госуслуг, необходимо провалидировать токен, указав путь к сертификату (открытому ключу), который можно скачать с сайта Госуслуг. Передав в метод isEsiaSignatureValid() полученную строку (data) и подпись (dataSignature), можно получить результат валидации в виде булева значения.

public static boolean isEsiaSignatureValid(String data, String dataSignature) throws Exception {  InputStream inputStream = EsiaUtil.class.getClassLoader().getResourceAsStream(CERTIFICATE); // Публичный ключ ЕСИА, представленный как поток  CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); // Создание объекта фабрики с указанием стандарта открытого ключа X.509  X509Certificate certificate = (X509Certificate) certFactory.generateCertificate(inputStream);  Signature signature = Signature.getInstance(certificate.getSigAlgName(), new JCP()); // Создание экземпляра класса Signature с указанием алгоритма подписи и провайдера JCP от КриптоПро  signature.initVerify(certificate.getPublicKey()); // Инициализация открытого ключа для верификации  signature.update(data.getBytes()); // Загрузка байтового массива строки, которую нужно верифицировать   return signature.verify(Base64.getUrlDecoder().decode(dataSignature));}

В соответствии с методическими указаниями необходимо проверять срок действия маркера. Если срок действия истек, то нужно создать новую ссылку с дополнительными параметрами и сделать запрос с помощью http-клиента:

URI refreshTokenUri = new URIBuilder(ESIA_TOKEN_API_URL)        .addParameters(Arrays.asList(                new BasicNameValuePair(RequestEnum.CLIENT_ID.getParam(), requestDto.getClientId()),                new BasicNameValuePair(RequestEnum.REFRESH_TOKEN.getParam(), tokenResponseDto.getRefreshToken()),                new BasicNameValuePair(RequestEnum.CODE.getParam(), code),                new BasicNameValuePair(RequestEnum.GRANT_TYPE.getParam(), EsiaConstants.REFRESH_GRANT_TYPE),                new BasicNameValuePair(RequestEnum.STATE.getParam(), requestDto.getState()),                new BasicNameValuePair(RequestEnum.SCOPE.getParam(), requestDto.getScope()),                new BasicNameValuePair(RequestEnum.TIMESTAMP.getParam(), requestDto.getTimestamp()),                new BasicNameValuePair(RequestEnum.TOKEN_TYPE.getParam(), requestDto.getTokenType()),                new BasicNameValuePair(RequestEnum.CLIENT_SECRET.getParam(), requestDto.getClientSecret()),                new BasicNameValuePair(RequestEnum.REDIRECT_URI.getParam(), requestDto.getRedirectUri())        ))        .build();

Получение данных пользователя


В нашем случае необходимо получить ФИО, дату рождения, паспортные данные и контакты.
Используем функциональный интерфейс, который поможет получать данные пользователя:

Function<String, String> esiaPersonDataFetcher = (fetchingUri) -> {  try {    URI getDataUri = new URIBuilder(fetchingUri).build();    HttpGet dataHttpGet = new HttpGet(getDataUri);       dataHttpGet.addHeader("Authorization", requestDto.getTokenType() + " " + tokenResponseDto.getAccessToken());    try (CloseableHttpResponse dataResponse = httpClient.execute(dataHttpGet)) {      HttpEntity dataEntity = dataResponse.getEntity();      return EntityUtils.toString(dataEntity);    }  } catch (Exception e) {    throw new UndeclaredThrowableException(e);  }};

Получение данных пользователя:

String personDataEntityString = esiaPersonDataFetcher.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId);

Получение контактов выглядит уже не таким очевидным, как получение данных пользователя. Для начала следует получить список ссылок на контакты:

String contactsListEntityString = esiaPersonDataFetcher.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId + "/ctts");EsiaListDto esiaListDto = objectMapper.readValue(contactsListEntityString, EsiaListDto.class);

Десериализуем этот список и получим объект esiaListDto. Поля из методички ЕСИА могут различаться, поэтому стоит проверить опытным путем.

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

for (String contactUrl : esiaListDto.getElementUrls()) {  String contactEntityString = esiaPersonDataFetcher.apply(contactUrl);  EsiaContactDto esiaContactDto = objectMapper.readValue(contactEntityString, EsiaContactDto.class);}

С получением списка документов та же ситуация. Вначале получаем список ссылок на документы:

String documentsListEntityString = esiaPersonDataFetcher.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId + "/docs");

Затем десериализуем его:

EsiaListDto esiaDocumentsListDto = objectMapper.readValue(documentsListEntityString, EsiaListDto.class);Переходим по каждой ссылке и получаем документы:for (String documentUrl : esiaDocumentsListDto.getElementUrls()) {  String documentEntityString = esiaPersonDataFetcher.apply(documentUrl);  EsiaDocumentDto esiaDocumentDto = objectMapper.readValue(documentEntityString, EsiaDocumentDto.class);}

Что теперь делать со всеми этими данными?


Мы можем сделать парсинг данных и получать объекты с требуемыми полями. Здесь каждый разработчик может оформлять классы как ему необходимо, в соответствии с техническим заданием.

Пример получения объекта с необходимыми полями:

final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);String personDataEntityString = esiaPersonDataFetcher.apply(ESIA_REST_API_URL + "/prns/" + esiaAccountId);EsiaPersonDto esiaPersonDto = objectMapper.readValue(personDataEntityString, EsiaPersonDto.class);

Заполняем объект esiaPersonDto необходимыми данными, например, контактами:

for (String contactUrl : esiaListDto.getElementUrls()) {  String contactEntityString = esiaPersonDataFetcher.apply(contactUrl);  EsiaContactDto esiaContactDto = objectMapper.readValue(contactEntityString, EsiaContactDto.class); // Десериализация контакта  if (esiaContactDto.getType() == null) continue;  switch (esiaContactDto.getType().toUpperCase()) {    case EsiaContactDto.MBT: // Если это номер мобильного телефона, то заполним поле mobilePhone      esiaPersonDto.setMobilePhone(esiaContactDto.getValue());      break;    case EsiaContactDto.EML: // Если это адрес электронной почты, то заполним поле email      esiaPersonDto.setEmail(esiaContactDto.getValue());  }}

Класс EsiaPersonDto выглядит следующим образом:

@Data@FieldNameConstants(prefix = "")public class EsiaPersonDto {  private String firstName;  private String lastName;  private String middleName;  private String birthDate;  private String birthPlace;  private Boolean trusted;  // тип учетной записи - подтверждена (true) / не подтверждена (false)  private String status;    // статус УЗ - Registered (зарегистрирована) /Deleted (удалена)  // Назначение полей непонятно, но они есть при запросе /prns/{oid}  private List<String> stateFacts;  private String citizenship;  private Long updatedOn;  private Boolean verifying;  @JsonProperty("rIdDoc")  private Integer documentId;  private Boolean containsUpCfmCode;  @JsonProperty("eTag")  private String tag;  // ----------------------------------------  private String mobilePhone;  private String email;  @javax.validation.constraints.Pattern(regexp = "(\\d{2})\\s(\\d{2})")  private String docSerial;  @javax.validation.constraints.Pattern(regexp = "(\\d{6})")  private String docNumber;  private String docIssueDate;  @javax.validation.constraints.Pattern(regexp = "([0-9]{3})\\-([0-9]{3})")  private String docDepartmentCode;  private String docDepartment;  @javax.validation.constraints.Pattern(regexp = "\\d{14}")  @JsonProperty("snils")  private String pensionFundCertificateNumber;  @javax.validation.constraints.Pattern(regexp = "\\d{12}")  @JsonProperty("inn")  private String taxPayerNumber;  @JsonIgnore  @javax.validation.constraints.Pattern(regexp = "\\d{2}")  private String taxPayerCertificateSeries;  @JsonIgnore  @javax.validation.constraints.Pattern(regexp = "\\d{10}")  private String taxPayerCertificateNumber;}

Работа по усовершенствованию сервиса будет продолжаться, ведь ЕСИА не стоит на месте.
Подробнее..

Работа ИТ-специалистов в Русфинанс Банке от найма до реализации амбициозных проектов

23.12.2020 14:04:12 | Автор: admin
При поиске работы у кандидатов часто возникают вопросы: рассматривать или не рассматривать ту или иную вакансию, оправдаются ли ожидания от работы, как будет выстроено взаимодействие внутри команды, чего ожидать при трудоустройстве. Поиск ответов на них и сбор информации отнимает силы и время (опросы знакомых, обращение к Google, получение рекомендаций на рынке и т.д.).

Чтобы сэкономить ресурсы и создать целостное представление о нашем банке, мы решили собрать ответы на самые актуальные вопросы в одной статье. Мы расскажем, как происходит найм и онбординг новичков, как выстроена работа команд, какие проекты реализуют разработчики-эксперты, какой стек технологий используют.

Если вам интересно узнать о работе ИТ-экспертов в международном банке из первых уст, предлагаем прочитать нашу статью.



О найме разработчиков


Какие этапы нужно пройти кандидату, чтобы попасть на работу в Русфинанс Банк?
Процесс подбора чаще всего включает в себя 3 этапа. Первый отбор резюме. По заранее определенным критериям рекрутер выбирает CV и обсуждает их с экспертами из IT. Если разработчику поступает звонок от рекрутера банка, он может быть уверен, его скилы и навыки интересны техническим специалистам. Второй этап онлайн встреча-знакомство. На ней присутствует HR, ИТ-эксперт и Product Owner (если вакансия открыта в Agile-команде). Проведение встречи со всеми заинтересованными сторонами экономит время кандидата, а также позволяет составить впечатление о будущих задачах и атмосфере в команде. По некоторым позициям есть 3-й этап тестовое задание. По итогам его выполнения организуется встреча с техническими специалистами для обсуждения хода решения. Если все этапы пройдены успешно, кандидат получает предложение о работе.

Какие критерии отбора резюме кандидатов на ИТ-вакансии?
Требования к успешному кандидату могут отличаться в зависимости от позиции, но, как правило, если речь идет о позиции разработчика, оцениваются следующие аспекты: опыт в разработке, знание необходимых технологий (например, Oracle PL/SQL), образование, предыдущий опыт работы (профиль компании, продолжительность работы, реализованные проекты).

Как организован процесс проведения интервью в пандемию?
До пандемии мы рассматривали кандидатов преимущественно из 2-х городов: Москва и Самара (там у нас находятся центральные офисы). Сейчас, когда большинство сотрудников работает удаленно, мы стали более гибкими и рассматриваем кандидатов из разных городов России.
Все этапы отбора проходят по видеосвязи. Это дает возможность нашим кандидатам не тратить время на дорогу, а нам более оперативно организовать интервью и закрывать вакансии. Оформлять на работу новых сотрудников мы также можем в городе их проживания.

Как происходит онбординг нового сотрудника?
После того, как все этапы интервью пройдены и кандидат принял предложение о работе, он присоединяется к нашей команде. Мы никогда не бросаем нового коллегу одного. Стараемся помочь ему быстрее адаптироваться, знакомим с коллегами, корпоративной культурой, приглашаем на адаптационные мероприятия (например, Induction Day), помогаем почувствовать себя в новой среде более уверено и комфортно. Как нам кажется, у нас в команде приятная, дружеская и по-настоящему воодушевляющая атмосфера.

Изменился ли онбординг в пандемию?
С переходом на удалёнку процесс адаптации перешёл в онлайн. Все встречи с новыми сотрудниками теперь проводятся в скайпе это, пожалуй, все, что изменилось. Сам процесс, по большому счету, остался прежним регулярные беседы с руководителем, максимальная поддержка на начальном этапе, регулярные взаимодействие с командой, предоставление обратной связи.

Знакомство новичка с членами команды сейчас выглядят так:



О работе


В каком формате сейчас работает команда?
С конца 2019 года мы внедряем технологию FLEХ-офис переводим сотрудников в Москве на работу с flex-ноутбуков. Благодаря этому наши ребята могут подключаться к работе из любой точки, где есть Интернет (из дома, из кафе и т.д.). В офисе больше нет закрепленных рабочих мест. Если сотруднику нужно выйти в офис, он выбирает любое понравившееся рабочее место в своей логической зоне. Это удобно.

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

О ключевых проектах


Над какими проектами работала команда?
Можно выделить несколько ключевых проектов, над которыми в последнее время активно работала команда.

1. Новый сайт банка. В июле 2020 года мы запустили современный и отвечающий последним требованиям технологий сайт банка. На новом сайте можно онлайн рассчитать стоимость кредита, отправить заявку на кредит, зайти в свой личный кабинет (для клиентов физических лиц). Личный кабинет для клиентов юридических лиц также уже разработан, и в начале 2021 года он станет доступен первым дилерам.



2. Продукт Автокредитование. В пандемию одним из направлений, развитием которого мы занимались в рамках продукта Автокредитование, стала онлайн интеграция с брендами/ дилерами/ класифайдерами.

По сути, мы разрабатывали сервисы для интеграции наших систем с внешним миром, начиная с форм для самостоятельной отправки анкеты клиентом через наши или партнёрский сайты и заканчивая брокерским софтом, CRM-системами партнёров.

Цель перед нами стояла амбициозная реализовать 5 интеграций с брендами/дилерами/ класифайдерами до конца 2020 года. И несмотря на форс-мажор с пандемией, мы сейчас очень близки к её достижению. Если 2020 год не преподнесет новых сюрпризов, мы можем даже превзойти свои первоначальные ожидания.

Об Agileтрансформации


Какие изменения внедряются в банке?
2020 год стал для нашей команды годом перехода на новый уровень в Agile-трансформации. Если раньше мы могли говорить только о том, что у нас есть несколько продуктовых SCRUM-команд, то теперь можем рассказать куда больше. Изначально мы черпали опыт, базируясь на том, что смогли имплементировать в текущие процессы разработки и сопровождения несколько SCRUM-команд. А потом с полученными знаниями пошли дальше.

Мы запустили новые сервисные команды, работающие по SCRUM, масштабировали по LeSS текущие продуктовые команды под одним большим продуктом Автокредитование и запустили 7 команд сервисов разработки по Kanban, и самое сложное связали все это в единую систему поставки ценности Клиенту. Все это было бы невозможно без команды по-настоящему вовлеченных и талантливых ребят.

Отдельно хочется рассказать про работу продуктовой команды Автокредитование нам удалось настроить её работу в классическом понимании LeSS.

Команда планирует свой спринт в два этапа, отбирая задачи из единого Backlog на Sprint planning 1 в фича тимы, и планирует работу непосредственно в Scrum командах на Sprint planning 2.

Демонстрирует результаты работы спринта на едином Sprint Review. Совершенствуется и решает системные вопросы внутри команды на Overall Retrospective. Опирается в своей работе на практики DevOps, постепенно внедряя новые инструменты и подходы.

Это позволяет нам эффективно работать над продуктом и выносить на прод новые фичи. Конечно, многие из них остаются незамеченными для клиентов физических лиц, так как большая часть работы происходит в направлении B2B, но и для конечных потребителей продукта в 2020 году были интересные изменения. Например, возможность входа и авторизации в онлайн-заявку на автокредит через Госуслуги, заполнение с помощью Dadata полей паспорта в онлайн-анкете, изменение дизайна онлайн-анкеты и еще много косметических доработок по отзывам и обратной связи от клиентов.

О технологиях


Какие стеки разработки используются на проектах?
Большинство проектов реализовано на стеке разработки Java EE + Oracle. Он обеспечивает высокую надежность, производительность и масштабируемость. Фреймворк используется собственной разработки.
Для фронтов развиваем направление React / TypeScript.
При разработке сайта используется JavaScript + Angular.
Управление разработкой ведем в Jira. Причем он используется как продуктовыми SCRUM-командами, так и core-сервисными командами, работающими по Waterfall.
Для тестов используется Selenium, есть тесты на Java, Kotlin, немного на Python.
Для мониторинга Grafana и Gattling.
Активно развиваем DevOps практики. Сервис CI/CD состоит из следующих компонентов: Jenkins, Nexus, SonarQube, сервер сбора метрик CI/CD (Grafana + InfluxDB).

Какова политика стандартов разработки и код-ревью?
Для основного стека внедрены стандарты разработки для унификации подходов к реализации. Активно проводится код-ревью.

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

О планах на будущее


Какие задачи будут стоять перед командой в будущем году?
Несмотря на то, что многое удалось реализовать, впереди еще много работы. 2021 год обещает быть насыщенным и интересным для команды. У нас уже есть идеи, как сделать продукты и сервисы банка лучше и удобнее для клиента, ну и постоянно меняющаяся среда наверняка поможет искать вдохновение для дальнейшего совершенствования.

А еще новый год будет ознаменован важным событием в 2021 году Русфинанс Банк будет присоединен к Росбанку.

Поэтому все новости о достижениях и реализованных проектах наших команд теперь можно будет узнавать в блоге Росбанка на Хабр.

До встречи на новой площадке в новом году!
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru