Comments 7
Код шифруется по алгоритму MD5
MD5 - это 128-битный алгоритм хеширования
Что из этого следует?
Шифрование - сохранение информации в неизменном виде, но без возможности доступа без ключа
Хеширование - Это формирования Хеша (контролей суммы) которая имеет коллизии (Несколько паролей будут иметь одну хеш сумму)
Помимо этого есть база соответствия md5 и исходных значений.
Тем самым вы ничего не шифруете. По факту храните пароли в открытом виде
Из этого следует, что лучше не писать свой сервис авторизации, а взять готовый аналог
https://en.wikipedia.org/wiki/Hash_function_security_summary
This attack takes seconds on a regular PC.
За несколько секунд ваш пароль будет определен.
https://habr.com/ru/company/acribia/blog/413157/
я не профессионал по безопасности, но судя по этой статье md5 используется для хранения паролей в других решениях типа Wordpress и Joomla
в примере моего кода используется двойное хеширование
Вот вы даете ссылку на статью и даже ее не читаете.
Она написана в 2018 году и уже тогда было:
Wordpress
До версий 3.х пароли просто хэшировались с помощью MD5. Сейчас используется библиотека phpass.
Joomla >= 3.2
Like @Lodder said, starting from 3.2, passwords are hashed using Bcrypt.
двойное хеширование
Каждое дополнительное хеширование уменьшает время необходимое для перебора пароля, лучше так не делать
Какой в итоге механизм аутентификации в 1с? Можете подробно описать, что происходит с момента ввода Логина и пароля на клиенте до попадания в http сервис 1с?
Здраствуйте eachebotarev!
Спасибо за интерес, проявленный к публикации.
Основные моменты можно описать следующим образом
1. По кнопке войти выполняется post запрос к http сервису 1с
export const login = (email, password) => {
return axios.post(`${API_URL}/?typerequest=login`, { email, password });
}
Для того что бы обращение попало в 1с для обработки, 1с http сервис сконфигурирован таким образом что все запросы выполняются под одним пользователем (vrd файл)
В модуле 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");
На клиенте запоминаю полученный accessToken и в дальнейшем в заголовки защищенных запросов добавляю authorization
export const executorRequests = (functionRequest, responseHandlingFunction, exceptionHandlingFunction, dispatch, repeat=false) => {
axios.defaults.headers.common = {
'authorization': `bearer ${getAccessToken()}`,
'fcm': localStorage.getItem('messageRecipientKey')
}
При обращении в к защищенному методу на стороне 1с проверяется валидность token, проверяется время жизни, проверяется что JWT id выдавался данному пользователю если все ок возвращается пользователь либо ошибка
accessToken = Запрос.Заголовки.Получить("authorization");
accessToken = СтрЗаменить(СтрЗаменить(accessToken, "bearer", ""), " ", "");
СтруктураПользователя = Авторизация.ПолучитьПользоватеяПоКлючу(accessToken);
Если ЗначениеЗаполнено(СтруктураПользователя.error) Тогда
Ответ = Новый HTTPСервисОтвет(401);
ДанныеОтвета = Новый Структура("error",СтруктураПользователя.error);
Иначе
Если на клиент возвращается ошибка доступа тогда клиент пытается обновить токены используя реализованный метод 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())})
}
1С http сервис с jwt авторизацией + клиент React js