Google OAuth и мобильное приложение

29.08.17

Интеграция - Внешние источники данных

Об аутентификации для работы с сервисами google из мобильного или настольного приложения

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Конфигурация + файлы шлюза
.zip 11,80Kb
10
10 Скачать (1 SM) Купить за 1 850 руб.

Вступление

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

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

Подготовка

Для начала в консоли необходимо создать проект и учетные данные "Идентификатор клиента OAuth" (веб-приложение). В поле "Разрешенные URI перенаправления" указать адреса шлюза (например, localhost/addcode/auth) на которые будет отвечать сервер google (конечный запрос будет иметь вид: localhost/addcode/auth?code=1&state=2&scope=3 или localhost/addcode/auth?state=1&error=2).  Этого будет достаточно, но для работы с каким-либо сервисом необходимо включить соответствующий api, создать ключ приложения... Об этом не буду писать, так как в интернете всё подробно расписано. В конце необходимо скачать из консоли json файл с учетными данными.

Далее потребуется веб-сервер (шлюз), где будут реализованы http-сервисы. Их можно сделать как на 1С, так и на другом, более универсальном, языке. Также шлюз физически может располагаться как в локальной сети, так и на хостинге в интернете. Я же выбрал вариант с бесплатным хостингом, где поддерживается php и mysql.

В общий макет УчетныеДанныеGoogle необходимо загрузить скачанный ранее json файл.

Реализация

Процедура аутентификации начинается с клиентской части:

&НаКлиенте
Процедура Войти(Команда)
	стрКлюч = Строка(Новый УникальныйИдентификатор);
	ДанныеДляВхода = СервисыGoogleКлиентСервер.ДанныеВходаВАккаунт();
	УчетныеДанные = ДанныеДляВхода.УчетныеДанные["web"]; 
	
	ШаблонЗапроса = ДанныеДляВхода.ШаблонЗапроса;
	ТекстЗапроса = СтрШаблон(ШаблонЗапроса, 
						УчетныеДанные["auth_uri"], 
						УчетныеДанные["client_id"], 
						УчетныеДанные["redirect_uris"][0], 
						ДанныеДляВхода.ОбластиДоступа, стрКлюч);
	
	ЗапуститьПриложение(ТекстЗапроса);
	
	ПодключитьОбработчикОжидания("ПолучитьКод", 3, Ложь);
КонецПроцедуры

Здесь формируется текст http-запроса, запускается браузер и подключается обработчик ожидания, который опрашивает шлюз. Переменная стрКлюч необходима для идентификации, по ней будем находить кому что принадлежит. В redirect_uris адреса, которые были указаны при создании учетных данных OAuth в консоли. По этим адресам будет перенаправлять сервер google после ответа пользователя. Нам же необходимо обработать ответ и вывести пользователю результат (успешно...).

Файл index.php

<?php
$servername = "";
$username = "";
$password = "";
$dbname = "";

$setData = false;
if(isset($_GET["error"]) && !empty($_GET["error"])){
	$state = $_GET["state"];
	$code = "";
	$error = $_GET["error"];
        $scope = "";
	$setData = true;
}elseif(!empty($_GET)){
	$state = $_GET["state"];
	$code = $_GET["code"];
	$error = "";
        $scope = $_GET["scope"];
	$setData = true;
}

if($setData){
	
	$conn = new mysqli($servername, $username, $password, $dbname);
	if ($conn->connect_error) {
		die("Connection failed: " . $conn->connect_error);
	}
	
	$sql = "INSERT INTO tCodes (state, code, error, scope) VALUES ('$state', '$code', '$error', '$scope')";
		
	if ($conn->query($sql) === TRUE) {
		echo "Код получен";
	} else {
		echo "Error: " . $sql . "<br>" . $conn->error;
	}
	$conn->close();
}
?>

Код получает значения параметров из запроса и записывает их в базу данных. При использовании такого же способа предварительно нужно создать базу данных и таблицу. Значение параметра state - это стрКлюч, code - код для получения токенов, scope - область доступа. В php не силен, но код рабочий, собирал копипастой из интернета как черновик, а для рабочих систем можно сделать лучше.

Всё это время 1С опрашивает шлюз с ключом и как только ответ будет получен обработчик отключается.

Обработчик ожидания ПолучитьКод:

&НаКлиенте
Процедура ПолучитьКод() Экспорт
	
	АдресШлюза = "";
	ТекстЗапроса = "?state=" + стрКлюч;
		
	Запрос = Новый HTTPЗапрос(ТекстЗапроса);
	Соединение = Новый HTTPСоединение(АдресШлюза,,,,,, Новый ЗащищенноеСоединениеOpenSSL);
	Ответ = Соединение.Получить(Запрос);
	стрОтвет = Ответ.ПолучитьТелоКакСтроку();
	
	РезультатЧтения = ОбщегоНазначенияКлиентСервер.ПеревестиJsonВОбъект(стрОтвет);
	Если РезультатЧтения["state"] = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОтключитьОбработчикОжидания("ПолучитьКод");
	// Далее механизм обмена кода на токен обновления и токен доступа

КонецПроцедуры

В процедуре нужно указать адрес своего шлюза (например, localhost/addcode/auth/res.php), где реализована обработка и передача данных.

Файл res.php

<?php
$servername = "";
$username = "";
$password = "";
$dbname = "";

$state= $_GET['state'];

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
	die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT state, code, error, scope FROM tCodes WHERE state = '$state'";
$result = $conn->query($sql);

if ($result->num_rows == 1) {
	$row = $result->fetch_assoc();
	$data = [ 'state' => $row["state"], 'code' => $row["code"], 'scope' => $row["scope"], 'error' => $row["error"]];
        echo json_encode( $data );
	
	$sql = "DELETE FROM tCodes WHERE state = '$state'";
	$conn->query($sql);
} else {
    $data = [ 'error' => 'not_found' ];
    http_response_code(404);
    echo json_encode( $data );
}

$conn->close();
?>

Запрос получает данные по ключу и возвращает в виде json. Этот код тоже рабочий черновик.

Далее значение параметра code нужно обменять на токены (продолжение процедуры ПолучитьКод).

	Код = РезультатЧтения["code"];
	ДанныеОбменаКодаНаТокен = СервисыGoogleКлиентСервер.ДанныеОбменаКодаНаТокен(стрКлюч);
	УчетныеДанные = ДанныеОбменаКодаНаТокен.УчетныеДанные["web"];
	ШаблонЗапроса = ДанныеОбменаКодаНаТокен.ШаблонЗапроса;
	ТекстЗапроса = СтрШаблон(ШаблонЗапроса, Код, УчетныеДанные["client_id"], УчетныеДанные["client_secret"], УчетныеДанные["redirect_uris"][0]);
	
	Запрос = Новый HTTPЗапрос(ДанныеОбменаКодаНаТокен.АдресРесурса);
	Запрос.Заголовки = ДанныеОбменаКодаНаТокен.Заголовки;
	Запрос.УстановитьТелоИзСтроки(ТекстЗапроса);
	
	Соединение = Новый HTTPСоединение(ДанныеОбменаКодаНаТокен.АдресСервера,,,,, 10, Новый ЗащищенноеСоединениеOpenSSL);
	Ответ = Соединение.ОтправитьДляОбработки(Запрос);
	стрОтвет = Ответ.ПолучитьТелоКакСтроку();
	Если Ответ.КодСостояния = 200 Тогда
		РезультатЧтения = ОбщегоНазначенияКлиентСервер.ПеревестиJsonВОбъект(стрОтвет);
		стрТокенОбновления = РезультатЧтения["refresh_token"];
		стрТокенДоступа = РезультатЧтения["access_token"];
		
		Если ЗначениеЗаполнено(стрТокенОбновления) Тогда
			УстановитьТокенОбновления(стрТокенОбновления);
		КонецЕсли;
	КонецЕсли;
	
	стрРезультат = стрОтвет;

Итог

Данный способ довольно прост, позволяет получить код без участия пользователя и кроссплатформенный. Напоследок приведу несколько скриншотов приложения:

Инициируем процедуру входа.

Открывается браузер, пользователь выбирает аккаунт и разрешает или отклоняет запрос.

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

Приложение всё это время опрашивает шлюз и обменивает код на токены.

Проверяем запросом данных пользователя.

В архиве конфигурация и файлы шлюза.

google oauth oauth мобильное приложение 1c oauth

См. также

Внешние источники данных Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Управляемые формы Анализ и прогнозирование Конфигурации 1cv8 Узбекистан Беларусь Кыргызстан Молдова Россия Казахстан Платные (руб)

Готовое решение для автоматической выгрузки данных из 1С 8.3 в базу данных ClickHouse, PostgreSQL или Microsoft SQL для работы с данными 1С в BI-системах. «Экстрактор данных 1С в BI» работает со всеми типовыми и нестандартными конфигурациями 1С 8.3 и упрощает работу бизнес-аналитиков. Благодаря этому решению, специалистам не требуется быть программистами, чтобы легко получать данные из 1С в вашей BI-системе.

15.11.2022    19648    18    SQV0    49    

37

Зарплата Внешние источники данных Бюджетный учет Перенос данных 1C Системный администратор Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    24356    23    1    

25

1С-программирование Мобильная разработка Программист Стажер Платные (руб)

Данный онлайн-курс предусматривает изучение базовых принципов создания приложений для операционной системы Android, работающих на мобильной платформе “1С:Предприятие”. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие” при разработке прикладных решений для “обычных” компьютеров, но пока ещё не занимался разработкой 1С-приложений, предназначенных для работы на мобильных устройствах.

08.06.2023    9536    0    Infostart    0    

66

Поиск данных Внешние источники данных Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Если вам нужно автоматически генерировать представления (view) к вашей базе данных 1С (есть две версии - для СУБД MS SQL Server и для PostgreSQL) по структуре метаданных 1С, то вам необходима данная обработка. Наш "Генератор View", другими словами - это коннектор к данным 1С для Power BI - незаменимый помощник для бизнес-аналитиков, работающих с базами 1С из Yandex Datalens/Power BI и т.д. Работает для обычных и управляемых форм под 1С 8.3

230000 руб.

31.07.2020    13502    13    48    

25

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Перенос данных 1C Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    10450    11    8    

13

WEB-интеграция Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Функциональное решение для торговли на всех популярных маркетплейсах. Работает со схемами FBO и FBS. Простое в использовании и установке, не вносит изменения в код программы. Существенно упрощает работу с товарным ассортиментом, обработку заказов с площадок, работу с поставками, а также ведение аналитики по продажам и остаткам.

72000 руб.

19.07.2024    1315    52    0    

3

Мобильная разработка Сканер штрих-кода Терминал сбора данных Управляемые формы Мобильная платформа 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Сбор заказов, инвентаризация, проверка ценников, просмотр полной информации об остатках и ценах со смартфона Онлайн - все это содержит в себе решение 1С "Штрихкод-информер" (штрих-код чекер). Отправка данных со смартфона выполняется либо напрямую в открытую форму документа, отсканировав QR-код, либо в общую корзину учетной системы, не подходя к компьютеру. Кассир или оператор сможет просмотреть список присланных данных и загрузить в любую форму, поддерживающую работу с ТСД. Для работы с мобильным приложением требуется опубликовать HTTP-сервис из поставляемого расширения.

2880 руб.

03.12.2018    58563    192    103    

172

SALE! 25%

Мобильная разработка Мессенджеры и боты Платформа 1С v8.3 1С:Конвертация данных Платные (руб)

Теперь создать telegram-бота - элементарно. Достаточно просто нарисовать блок-схему телеграм-бота, и он сразу заработает. Это возможно при использовании Графического конструктора телеграм-ботов. Это единственный конструктор ботов для telegram, чье качество и функционал подтверждены фирмой 1С, есть сертификат 1С:Совместимо. Расширение в интерактивном режиме, с помощью блок-схем, позволяет с минимальными трудозатратами создать телеграм-ботов в любой конфигурации, работающей на платформе «1С:Предприятие 8.3».

13200 9900 руб.

27.12.2021    37169    99    161    

193
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user958823 17.04.18 15:55 Сейчас в теме
Добрый день!
А конечный запрос на получение самих данных для каждой области доступа (scope) свой ? Имею ввиду, если например в первом запросе в scope указать https://www.googleapis.com/auth/calendar то куда делать запрос в последнем запросе ?
3. stveans@gmail.com 11 23.05.18 20:06 Сейчас в теме
(1)если ещё актуально: смотря что вам нужно. У календаря много методов. Подробнее можно узнать здесь.
2. user958823 18.04.18 14:13 Сейчас в теме
Помогите пожалуйста.
Можно где-то еще скачать эти файлы ?
Оставьте свое сообщение