Pull to refresh

Comments 7

Шифрование - сохранение информации в неизменном виде, но без возможности доступа без ключа

Хеширование - Это формирования Хеша (контролей суммы) которая имеет коллизии (Несколько паролей будут иметь одну хеш сумму)

Помимо этого есть база соответствия 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с для обработки, 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())})
                }
Sign up to leave a comment.

Articles