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

29.08.17

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

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

Скачать файлы

Наименование Файл Версия Размер
Конфигурация + файлы шлюза
.zip 11,80Kb
10
.zip 11,80Kb 10 Скачать

Вступление

В интернете есть много публикаций на эту тему и все из них подразумевают аутентификацию через встроенный в приложение браузер. В мобильном приложении данный способ не сработает, так как 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

См. также

Перенос данных из Парус 10 в ЗГУ ред.3

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

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

60000 руб.

05.10.2022    9155    9    8    

10

Перенос данных из Парус 8 в ЗГУ 3

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

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

84000 руб.

19.08.2020    22346    18    1    

21

"Штрихкод-информер" - мобильный ТСД и прайс-чекер в смартфоне

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

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

2880 руб.

03.12.2018    54423    135    102    

160

Автоматическая многопоточная выгрузка данных 1С 8.3 в БД Clickhouse и MS SQL (для работы с данными 1С в BI-системах)

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

Готовое решение для автоматизированной выгрузки данных из 1С 8.3, а также MS Excel в базу данных ClickHouse, а также в Microsoft SQL для работы с данными 1С в Yandex Datalens, Visiology, Apache Superset (и не только) - "Экстрактор данных 1С в BI". Решение отлично работает со всеми типовыми (и не только) конфигурациями 1С 8.3 для управляемых форм. Gозволяет автоматизировать работу бизнес-аналитика по ежедневной выгрузке данных из 1С в БД ClickHouse для последующей работы с этой БД в Yandex Datalens/ Система полностью автоматизирует работу с хранилищем данных в БД Clickhouse/MS SQL. Не надо быть программистом, чтобы одной кнопкой получать любые данные из 1С в Вашей BI-системе

230000 руб.

15.11.2022    12906    11    47    

28

Перенос данных из Парус 7.хх в ЗГУ ред.3

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

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

24000 руб.

24.04.2017    48627    96    159    

86

SALE! 25%

Что нам стоит бота построить? Нарисуем - будет жить! Графический конструктор телеграм-ботов/Telegram

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

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

13200 9900 руб.

27.12.2021    33019    80    157    

173
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 Сейчас в теме
Помогите пожалуйста.
Можно где-то еще скачать эти файлы ?
Оставьте свое сообщение