Evgenii Legotckoi
Evgenii LegotckoiҚаң. 26, 2017, 12:07 Т.Қ.

Qt қолданбасын OAuth 2.0 арқылы Google қызметтеріне қосу

С выпуском Qt 5.8 был добавлен модуль QtNetworkAuth в качестве технологии на предварительном рассмотрении. Он сфокусирован на помощи разработчикам с их безумием в аутентификации. На данный момент поддерживаются OAuth1 и OAuth2 . В будущем будет включено ещё несколько методов авторизации.

Данный пост ориентирован на поддержку OAuth2 в Qt. Здесь показано, как использовать авторизацию Google в приложении. Ваше приложение будет способно показать типичное окно авторизации, как в веб-приложении (Примечание: требуется браузер или WebView).

IETF определяет OAuth 2.0, как:

OAuth 2.0 фреймворк авторизации позволяет третьим приложениям получить ограниченный доступ к HTTP сервисам, либо со стороны владельца ресурса для организации взаимодействия  между владельцем ресурса и HTTP сервисом, либо разрешить приложениям третьей стороны получить собственный доступ.

OAuth авторизация также является требованием использования Google API и доступа пользователя к информации, которая хранится в сервисах Google, таких как Gmail, Drive, Youtube, Maps, и других.


Регистрация вашего нового проекта

Перед началом написания кода вам необходимо зарегистрировать новый проект в сервис провайдере. Этот шаг необходим, поскольку вы будете запрашивать учетные данные клиента для идентификации вашего приложения. Следующие шаги основаны на Google API Console, но они похожи и для других провайдеров.

Создание нового проекта

Для начала регистрации проекта получите доступ в Google API Console , затем нажмите “Create Project”.

Появится диалог “New Project”. Напечатайте имя вашего проекта и нажмите кнопку "Create". Сейчас вы готовы управлять вашим новым проектом.

Ваше приложение зарегистрировано, панель управления обновлена и Вы можете установить различные параметры из этого окна.

Создание учетных данных

Вы можете получить учётные данные для идентификации приложения. Перейдите в раздел "Credentials" и нажмите кнопку "Create credentials". Вы должны выбрать, какие учётные данные вам нужны. Выберите “OAuth client ID”.

В следующем окне, Вы можете настроить "экран согласия" с вашим адресом электронной почты, название продукта, домашнюю страницу, логотип продукта, ... Заполните его вашими данными и нажмите кнопку "Save".

Вернитесь обратно к экрану “Create client ID” и выберите "Application type”. Здесь доступны различные параметры, вам необходимо выбрать “Web application”. Введите его имя.

Под “Restrictions” имеется важное поле: “Authorized redirect URIs”.

Если пользователь выбирает позволить вашему приложения обрабатывать его данные, то приложение принимает “access token”, которые будет использоваться для запросов авторизации. “access token” может быть принят несколькими способами, но обычным способом является приём запроса своим веб-сервером с “access token”. В веб-приложении, пути сервера достаточно для обработки. В десктоп приложении необходимо подделать путь, используя локальный браузер.

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

В большинстве случаем вам необходимо будет использовать URI похожий на: “http://localhost:8080/cb”.

Примечание: Путь "/cb" является обязательным в текущей реализации QOAuthHttpServerReplyHandler.

Примечание: Вы можете настроить различные идентификаторы URI. В этом примере предполагается один URI.

Завершаем процесс, нажав на кнопку "Create", и вы увидите новое удостоверение в списке полномочий с "Edit", "Delete" и "Download" кнопками справа. Нажмите кнопку загрузки и ... И, наконец, вы получите готовый файл в формате JSON для синтаксического анализа!

На скриншоте выше вы можете увидеть некоторые новые идентификаторы URI и client_id и client_secret. Там нет необходимости использовать файл в формате JSON, вы можете жёстко задать эту информацию непосредственно в приложении.

Написание кода обёртки для Google API

Здесь опущена часть определения класса, чтобы показать соответствующий код.

Создайте в вашем коде объект QOAuth2AuthorizationCodeFlow :

auto google = new QOAuth2AuthorizationCodeFlow;

Настройка области разрешений, требуемых для вашего приложения. Эта область определяет права доступа приложения. Это может быть одна строка или список строк, разделённых символом, определяемым провайдером сервиса. (Google использует пробел в качестве разделителя).

ПРИМЕЧАНИЕ: области различаются в зависимости от поставщика. Чтобы получить список областей, поддерживаемых Google API, нажмите здесь .

Давайте использовать область, с которой будем получать доступ к электронной почте пользователя:

google->setScope("email");

Подключите сигнал authorizeWithBrowser к функции QDesktopServices::openUrl для открытия внешнего браузера и завершению авторизации.

connect(google, &QOAuth2AuthorizationCodeFlow::authorizeWithBrowser, &QDesktopServices::openUrl);

Разберите скачанный JSON, чтобы получить настройки и требуемую информацию. document является объектом класса QJsonDocument из скачанного файла.

const auto object = document.object();
const auto settingsObject = object["web"].toObject();
const QUrl authUri(settingsObject["auth_uri"].toString());
const auto clientId = settingsObject["client_id"].toString();
const QUrl tokenUri(settingsObject["token_uri"].toString());
const auto clientSecret(settingsObject["client_secret"].toString());
const auto redirectUris = settingsObject["redirect_uris"].toArray();
const QUrl redirectUri(redirectUris[0].toString()); // Get the first URI
const auto port = static_cast<quint16>(redirectUri.port()); // Get the port

После парсинга файла настройте объект google.

google->setAuthorizationUrl(authUri);
google->setClientIdentifier(clientId);
google->setAccessTokenUrl(tokenUri);
google->setClientIdentifierSharedKey(clientSecret);

Создание и назначение QOAuthHttpServerReplyHandler, как обработчик ответа объекта QOAuth2AuthorizationCodeFlow. Обработчик ответа является объектом, который обрабатывает ответы от сервера и получает token`ы, как результат процесса авторизации.

auto replyHandler = new QOAuthHttpServerReplyHandler(port, this);
google->setReplyHandler(replyHandler);

Функция grant начнет процесс авторизации.

google->grant();

Если всё нормально, то вы должны получить QOAuth2AuthorizationCodeFlow::granted signal и начать посылать запросы авторизации.

Вы можете попробовать послать запрос, используя https://www.googleapis.com/plus/v1/people/me

auto reply = google->get(QUrl("https://www.googleapis.com/plus/v1/people/me"));

Это даст вам QNetworkReply и когда сигнал QNetworkReply::finished будет вызван, вы сможете прочитать данные.

Источник Qt Blog

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

KL
  • Қаң. 27, 2017, 2:39 Т.Қ.

При помощи данного класса можно получить доступ к google.com/webmaster?

Evgenii Legotckoi
  • Қаң. 28, 2017, 6:33 Т.Ж.

Да. Можно. У Google есть соответствующее API. Поищите в гугле по запросу Google Search Console OAuth API

TheGringerEye
  • Сәуір 20, 2017, 7:48 Т.Қ.

Пытаюсь прикрутить к облаку яндекса и пока без успешно, кто-то пробовал с яндекс апи работать под этим классом?

Evgenii Legotckoi
  • Сәуір 21, 2017, 7:08 Т.Ж.

Лично я не пробовал работать с Яндекс API, не возникало такой нужды.

TheGringerEye
  • Сәуір 24, 2017, 3:36 Т.Ж.

Жаль, а то проблемы возникли, по гайду с гуглом у меня всё чётко, а при работе с яндексом почему-то не работает, а в дебаг пишет мол 404, хотя я лично своими руками в браузере через аякс запрос постом нормально получаю токен, а класс чёт не хочет.

Evgenii Legotckoi
  • Сәуір 24, 2017, 3:39 Т.Ж.

Возможно, стоит Wireshark`ом запросы посмотреть. В чём отличие идёт аякс запроса от запроса из библиотеки. Возможно, что не хватает какой-нибудь заголовочной информации.

TheGringerEye
  • Сәуір 24, 2017, 5:08 Т.Ж.

А с DropBox работали?

Evgenii Legotckoi
  • Сәуір 24, 2017, 9:38 Т.Ж.

Нет

TheGringerEye
  • Сәуір 24, 2017, 9:50 Т.Ж.

Пробовал играться с шарком, либо я криво смотрел, либо почему-то POST запросы на oauth.yandex.ru не летят, хотя должны постом лететь, я и исходники QOAuth2AuthorizationCodeFlow ковырял на предмет метода отправки, вроде бы везде POST, но в браузере GET открывается, ничего не понятно.

Evgenii Legotckoi
  • Сәуір 24, 2017, 10:44 Т.Ж.

У меня пока мыслей на этот счёт нет ((

D
  • Наурыз 9, 2018, 2:56 Т.Ж.

Спасибо за статью.
Я правильно понял, что в консольных программах использовать данный способ авторизации не получится? (QDesktopServices требует QtGui.) Или QtNetworkAuth можно и по-другому использовать?

Evgenii Legotckoi
  • Наурыз 9, 2018, 3:03 Т.Ж.

Вы можете написать консольную программу и использовать библиотеки QtGui. Я, например, использовал QImage и другие классы из QtGui в одной консольной программе. В этом нет никакой проблемы. Создаёте консольное приложение и подключаете в pro файле gui модуль.

D
  • Наурыз 9, 2018, 3:10 Т.Ж.

Ну в общем-то, да. Тащить только дополнительные зависимости в код придётся.

D
  • Наурыз 9, 2018, 3:14 Т.Ж.

Меня, в общем-то, авторизация в гугле заинтересовала, поскольку я пытаюсь в свой редактор контактов добавить импорт адресных книг с сетевых ресурсов. (Нет, сам он не консольный, а вполне себе оконный, просто на той же кодовой базе у меня есть и  простой конвертор с интерфейсом командной строки.) Загрузка с ресурсов вроде ownCloud/Nextcloud у меня уже работает через CardDAV, но в случае с гуглом всё сложнее именно из-за авторизации...

Evgenii Legotckoi
  • Наурыз 9, 2018, 3:19 Т.Ж.

Зависимости... здесь вопрос в том, что "Вам шашечки или ехать?".

Если Вы хотите реализовать рабочий прототип приложения, то я бы на вашем месте и не думал о том, что будет на пару библиотек больше в коде, тем более, что это библиотеки из самого Qt, а не третьесторонние непонятно откуда. А когда заработает, то можно посмотреть исходники Qt, может тот метод состоит всего-то из пары, тройки строчек, которые можно скопипастить и почистить. Тогда и библиотека не понадобится в дальнейшем.
D
  • Наурыз 17, 2018, 9:32 Т.Қ.

Интересный результат получается. В Qt 5.8 получаю в браузере сформированное окно авторизации. А в новейшей Qt 5.10 - ошибку 400 с текстом "The redirect URI in the request, http://localhost:8080/, does not match the ones authorized for the OAuth client". Да, именно с таким URI, без /cb на конце, хотя он у меня всюду вбит. Исходные данные одинаковы. Что-то поломали...

Evgenii Legotckoi
  • Наурыз 18, 2018, 8:43 Т.Ж.

Мне кажется, что в Qt 5.10 много чего поломали... Вот на форуме некоторые обсуждения идут и создаётся впечатление, что много чего испортили даже в том же QML.

D
  • Наурыз 22, 2018, 4:41 Т.Ж.

Кажется, начало что-то получаться. :)
Как я понял, пример проверочного вызова в конце статьи не совсем правильный (заглянул в английский оригинал - там то же самое). Токен сам к запросу не добавляется, его надо добавить вручную. Например, приведённый запрос для гуглоплюса у меня сработал в следующей редакции:

    QNetworkReply* reply = google->get(QUrl(
         QString("https://www.googleapis.com/plus/v1/people/me?access_token=%1")
             .arg(google->token())));
Ну и Google+ API при этом, конечно же, надо разрешить в настройках аккаунта (автор этот момент не раскрыл).

a
  • Наурыз 24, 2022, 2:49 Т.Қ.

Добрый вечер. Интересует возможность получения email адреса, указанного при авторизации данным методом. Результат выводик как на скриншоте, но хочется увидеть конкретный адрес. Буду благодарен за любую помощь

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 1:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:20ұпай,
  • Бағалау ұпайлары-10
Соңғы пікірлер
i
innorwallҚар. 14, 2024, 4:05 Т.Ж.
ЖАМАНДЫҚ ЯРЕК. Google reCAPTCHA пайдалану 2001; 98 29 34 priligy buy
i
innorwallҚар. 14, 2024, 2:54 Т.Ж.
Джанго - Сабақ 003. Джангодағы үлгі, үлгі және көрініс Hair follicles are believed to produce approximately 20 individual hair shafts over the life of the follicle as the follicle progresses through cycles of hair production, shedding ejection, invo…
i
innorwallҚар. 13, 2024, 11:03 Т.Қ.
Qt тілінде ойын қалай жазылады - 3-сабақ. Басқа объектілермен әрекеттесу what is priligy tablets What happens during the LASIK surgery process
i
innorwallҚар. 13, 2024, 8:09 Т.Қ.
C++ файлдарының ішінде CMakeLists.txt ішінде жарияланған айнымалы мәндерді пайдалану where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
Енді форумда талқылаңыз
i
innorwallҚар. 14, 2024, 3:39 Т.Ж.
добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
i
innorwallҚар. 11, 2024, 10:55 Т.Ж.
Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз