...
Раскрыть |
---|
title | Мобильное приложение. Проверка одноразового кода и отправка уведомления об авторизации на сервер |
---|
|
Блок кода |
---|
&НаКлиенте
Процедура ОдноразовыйКодПриИзменении(Элемент)
Если ОдноразовыйКод = 0 Тогда
Возврат;
КонецЕсли;
Если ОдноразовыйКод <> ОдноразовыйКодИзСообщения Тогда
Сообщить("Коды не совпадают");
Возврат;
КонецЕсли;
Пользователь = ЛогинИзСообщения;
Пароль = ПарольИзСообщения;
ОК(Неопределено);
КонецПроцедуры
&НаКлиенте
Процедура ОК(Команда)
Ответ = ПроверитьЛогинИПароль(Пользователь, Пароль);
Если Ответ = Истина Тогда
ОбщийКлиент.УстановитьIDУстройства();
Оповестить("АвторизацияПрошлаУспешно");
Закрыть(Истина);
Иначе
ОбменСервер.ДобавитьОшибкуВРегистр(Ответ, ПредопределенноеЗначение("Перечисление.ТипПротоколаСобытий.Ошибка"));
Сообщить("Неправильный логин или пароль");
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПроверитьЛогинИПароль(Пользователь, Пароль) Экспорт
УстановитьПривилегированныйРежим(Истина);
Попытка
КодМобильногоУстройства = ОбщийСервер.ПолучитьКодМобильногоУстройства();
Запрос = Новый HTTPЗапрос;
АдресРесурса = СокрЛП(Константы.ИмяБазы.Получить()) + "/hs/ObmenHTTPFairObserver/GetInitialData/" + КодМобильногоУстройства + "/" + Пользователь;
Если ЗначениеЗаполнено(Константы.МобильнаяОС.Получить()) Тогда
АдресРесурса = АдресРесурса + "?MobileOS=" + Строка(Константы.МобильнаяОС.Получить());
КонецЕсли;
Запрос.АдресРесурса = АдресРесурса;
Соединение = Новый HTTPСоединение(Константы.IPСервера.Получить(),,Пользователь, Пароль,,, Новый ЗащищенноеСоединениеOpenSSL);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 401 Тогда
Возврат "Неправильный логин или пароль";
ИначеЕсли Ответ.КодСостояния = 200 Тогда
УстановитьПривилегированныйРежим(Истина);
ЦентральныйУзелОбмена = ИнициализацияОбмена(Пользователь, КодМобильногоУстройства);
ДанныеОбменаXML = Ответ.ПолучитьТелоКакСтроку();
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеОбменаXML);
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML, ДопустимыйНомерСообщения.Любой);
Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл
Данные = ПрочитатьXML(ЧтениеXML);
Если НЕ Данные = Неопределено Тогда
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦикла;
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
Константы.ИмяПользователя.Установить(Пользователь);
Константы.Пароль.Установить(Пароль);
Возврат Истина;
Иначе
Возврат Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
Исключение
Возврат ОписаниеОшибки();
КонецПопытки;
КонецФункции
&НаСервере
Функция ИнициализацияОбмена(Пользователь, КодМобильногоУстройства) Экспорт
УстановитьПривилегированныйРежим(Истина);
ЦентральныйУзелОбмена = ПланыОбмена.РВ_СправедливыйНаблюдатель.НайтиПоКоду("001");
Если ЦентральныйУзелОбмена.Пустая() Тогда
НовыйУзел = ПланыОбмена.РВ_СправедливыйНаблюдатель.СоздатьУзел();
НовыйУзел.Код = "001";
НовыйУзел.Наименование = "Центральный";
НовыйУзел.Записать();
ЦентральныйУзелОбмена = НовыйУзел.Ссылка;
КонецЕсли;
Узел = ПланыОбмена.РВ_СправедливыйНаблюдатель.ЭтотУзел();
Если НЕ ЗначениеЗаполнено(Узел.Код) ИЛИ Узел.Код <> КодМобильногоУстройства Тогда
ОбъектУзла = Узел.ПолучитьОбъект();
ОбъектУзла.Код = КодМобильногоУстройства;
ОбъектУзла.Наименование = Пользователь;
ОбъектУзла.Записать();
КонецЕсли;
Возврат ЦентральныйУзелОбмена;
КонецФункции
|
|
После успешной авторизации запускается регистрация начальных данных для данного пользователя. Я отправляю только те данные (записи справочников, регистров), которые точно понадобятся пользователю. Остальные данные можно отправить позднее
Раскрыть |
---|
title | Сервер. Регистрация начальных данных на узле авторизованного пользователя |
---|
|
Блок кода |
---|
Функция GetInitialData(Запрос)
УстановитьПривилегированныйРежим(Истина);
Попытка
КодМобильногоУстройства = Запрос.ПараметрыURL.Получить("КодМобильногоУстройства");
ИмяПользователя = Запрос.ПараметрыURL.Получить("ИмяПользователя");
МобильнаяОС = Перечисления.РВ_МобильнаяОС.ПустаяСсылка();
Для Каждого ТекПараметр ИЗ Запрос.ПараметрыЗапроса Цикл
Если ВРег(ТекПараметр.Ключ) = ВРег("MobileOS") Тогда
МобильнаяОС = Перечисления.РВ_МобильнаяОС[ТекПараметр.Значение];
КонецЕсли;
КонецЦикла;
УзелОбмена = ИнициализацияУзлаОбмена("РВ_СправедливыйНаблюдатель", Справочники.РВ_МобильноеПриложение.СправедливыйНаблюдатель, КодМобильногоУстройства, ИмяПользователя, МобильнаяОС);
ОтветНаблюдателю = ОтдатьНачальныеДанныеСправедливомуНаблюдателю(УзелОбмена, КодМобильногоУстройства, ИмяПользователя);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(ОтветНаблюдателю);
Исключение
Ответ = Новый HTTPСервисОтвет(400);
Ответ.УстановитьТелоИзСтроки(ОписаниеОшибки());
КонецПопытки;
Возврат Ответ;
КонецФункции
Функция ИнициализацияУзлаОбмена(ИмяПланаОбмена, МобильноеПриложение, КодУстройства, ИмяПользователя, МобильнаяОС) Экспорт
УстановитьПривилегированныйРежим(Истина);
УзелОбмена = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодУстройства);
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если ПользовательИБ = Неопределено Тогда
Пользователь = Неопределено;
Иначе
Пользователь = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ПользовательИБ.УникальныйИдентификатор);
КонецЕсли;
Если УзелОбмена.Пустая() Тогда
НовыйУзел = ПланыОбмена[ИмяПланаОбмена].СоздатьУзел();
НовыйУзел.Код = КодУстройства;
НовыйУзел.Наименование = ИмяПользователя;
Если ЗначениеЗаполнено(МобильнаяОС) Тогда
НовыйУзел.МобильнаяОС = МобильнаяОС;
КонецЕсли;
НовыйУзел.Пользователь = Пользователь;
НовыйУзел.ДатаСоздания = ТекущаяДата();
НовыйУзел.ОбменДанными.Загрузка = Истина;
НовыйУзел.Записать();
УзелОбмена = НовыйУзел.Ссылка;
ИначеЕсли УзелОбмена.Наименование <> ИмяПользователя ИЛИ УзелОбмена.Пользователь <> Пользователь Тогда
ОбъектУзла = УзелОбмена.ПолучитьОбъект();
ОбъектУзла.Наименование = ИмяПользователя;
ОбъектУзла.Пользователь = Пользователь;
ОбъектУзла.ДатаСоздания = ТекущаяДата();
ОбъектУзла.Записать();
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена);
КонецЕсли;
Возврат УзелОбмена;
КонецФункции
Функция ОтдатьНачальныеДанныеСправедливомуНаблюдателю(Знач УзелОбмена, КодУстройства, ИмяПользователя)
УстановитьПривилегированныйРежим(Истина);
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя);
Если ПользовательИБ = Неопределено Тогда
Возврат "no";
КонецЕсли;
ИмяXDTOПакета = "RV_FairObserver";
ЗаписьХМЛ = Новый ЗаписьXML;
ЗаписьХМЛ.УстановитьСтроку();
ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
ЗаписьСообщения.НачатьЗапись(ЗаписьХМЛ, УзелОбмена);
//Здесь в сообщение записываются начальные данные
ЗаписьСообщения.ЗакончитьЗапись();
Результат = ЗаписьХМЛ.Закрыть();
Результат = СтрЗаменить(Результат, " xmlns=""" + ИмяXDTOПакета + """ xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""","");
Возврат Результат;
КонецФункции |
|
Полезные ссылки