Pull to refresh
3
0
Send message

Всем привет!
Система для коллективной оценки трудоемкости задач по методологии "покер планирования"
https://poker-planning.ru/

https://github.com/inzarubin80/PokerPlanning

Еще хорошо бы выучить другой язык

Спасибо за статья, помогла разобраться.

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

Здраствуйте eachebotarev!
Спасибо за интерес, проявленный к публикации.

Основные моменты можно описать следующим образом
1. По кнопке войти выполняется post запрос к http сервису 1с

export const login = (email, password) => {
    return axios.post(`${API_URL}/?typerequest=login`, { email, password });
}
  1. Для того что бы обращение попало в 1с для обработки, 1с http сервис сконфигурирован таким образом что все запросы выполняются под одним пользователем (vrd файл)

  2. В модуле HS по типу запроса определяется обработчик

https://github.com/inzarubin80/authorization/blob/master/1c/HTTPServices/ВебПортал/Ext/Module.bsl

Если  ТипЗапроса = "login" Тогда		
		ДанныеОтвета = Авторизация.Логин(ДанныеЗапроса.email,  ДанныеЗапроса.password);	

Данный метод проверяет соответствие имени и пароля значению которое хранится в регистре сведений "ПаролиВнешнихПользователей" и если находится соответствие то генерируется два ключа accessToken и refreshToken

В конфигурации используется реализация jwt токена на платформе 1С представленная Vasily Pintov https://github.com/pintov/1c-jwt

Запоминаю в 1с jti — (JWT id)

Возвращаю в в теле запроса {accessToken, refreshToken}

Токены = СформироватьТокены(СтруктураПользователя.Пользователь, ИдентификаторПользователя);
Ответ.accessToken = Токены.accessToken;
Ответ.refreshToken = Токены.refreshToken;

Устанавливаю Cookie
Ответ.Заголовки.Вставить("Set-Cookie","refreshToken='" + refreshToken + "'; HttpOnly");

  1. На клиенте запоминаю полученный accessToken и в дальнейшем в заголовки защищенных запросов добавляю authorization

export const executorRequests = (functionRequest, responseHandlingFunction, exceptionHandlingFunction, dispatch, repeat=false) => {

    axios.defaults.headers.common = {
        'authorization': `bearer ${getAccessToken()}`,
        'fcm': localStorage.getItem('messageRecipientKey')
    }
  1. При обращении в к защищенному методу на стороне 1с проверяется валидность token, проверяется время жизни, проверяется что JWT id выдавался данному пользователю если все ок возвращается пользователь либо ошибка


accessToken = Запрос.Заголовки.Получить("authorization"); 
accessToken = СтрЗаменить(СтрЗаменить(accessToken, "bearer", ""), " ", "");		
		СтруктураПользователя = Авторизация.ПолучитьПользоватеяПоКлючу(accessToken);
			
		Если  ЗначениеЗаполнено(СтруктураПользователя.error) Тогда
			Ответ = Новый HTTPСервисОтвет(401);
			ДанныеОтвета = Новый Структура("error",СтруктураПользователя.error);
		Иначе			
  1. Если на клиент возвращается ошибка доступа тогда клиент пытается обновить токены используя реализованный метод refreshToken

const refreshToken = () => {
    return axios.post(`${API_URL}/?typerequest=refreshToken`, {});
} 

При этом обработчик в 1с получит Cookie refreshToken и проверив валидность токена сгенерирует новую пару accessToken, refreshToken

ИначеЕсли  ТипЗапроса = "refreshToken" Тогда		
		ДанныеОтвета = Авторизация.ПолучитьТокен(Cookie.Получить("refreshToken"));			
		Если ЗначениеЗаполнено(ДанныеОтвета.error) Тогда
			Ответ = Новый HTTPСервисОтвет(401);
		КонецЕсли;

После чего на клиенте выполняет исходный запрос..

  } else if (error.request.status == 401) {
                if (repeat) {
                    dispatch(logOut())
                }
                else {
                    refreshToken()
                    .then(response => {
                        setAccessToken(response.data.accessToken)
                        return executorRequests(functionRequest, responseHandlingFunction, exceptionHandlingFunction, dispatch, true);
                    })
                    .catch((error) => {dispatch(logOut())})
                }


https://habr.com/ru/company/acribia/blog/413157/
я не профессионал по безопасности, но судя по этой статье md5 используется для хранения паролей в других решениях типа Wordpress и Joomla
в примере моего кода используется двойное хеширование

Что из этого следует?

Добрый день! Весь бизнес в учётной системе на 1С, так же 1С имеет весь необходимый инструментарий для интегрирования и обмена данными, это http сервисы и работа с форматом json. Хочу отметить rest запросы к 1С работают хорошо, стабильно и быстро, в этом нареканий нет. Главное на стороне 1С запросы к БД и обработку результатов запроса делать попроще, чтоб быстро код работал. На данный момент с приложением работает около 300 водителей. С технической точки зрения это небольшая нагрузка, на работоспособность и быстродействие учётной системы 1С это ни как не повлияло. Сервера разные, сервер приложения 1С, сервер БД и web сервер на разных серверах. По поводу лицензий, на использование мобильного клиента 1С нужна лицензия, это было одной из причин не использовать мобильный клиент 1С. На http соединения к 1С лицензия не требуется и не расходуется из общего пула лицензий. Вопрос о промежуточной БД в качестве бэкэнда не рассматривался.

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

Добрый день! Обмен через REST сервис. POST запросы, в теле запросов json и ответ от сервера тоже в json. 1С имеет свои встроенные методы для сериализации и десериалицации json в свои типы данных, все очень удобно. JS на фронте соответсвенно json воспринимает как своё родное ). Хотя помню было время когда на стороне 1С приходилось вручную парсить json, то ещё удовольствие. Но время идет и 1С на месте стоит.

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

Information

Rating
Does not participate
Registered
Activity