LINUX.ORG.RU

OAuth 2.0 из десктопного приложения

 , , ,


0

1

Добрый день, ЛОР.

В общем, научился я загружать в десктопную программу, написанную на Qt, контакты по CardDAV из ownCloud. Решил взять источник посложнее - контакты Гугла. И читаю в их документации следующее:

Client applications must use HTTPS, and OAuth 2.0 authentication must be provided for the user's Google account. The CardDAV server will not authenticate a request unless it arrives over HTTPS with OAuth 2.0 authentication of a Google account, and your application is registered on DevConsole. Any attempt to connect over HTTP with Basic authentication or with an email/password that doesn't match a Google account results in an HTTP 401 Unauthorized response code.

С OAuth я раньше дела не имел. Погуглил, какие есть у людей решения и наброски. В общем, как я понял, единственный способ авторизоваться - это тащить в свою программу отдельное Web-окно, загрузить оттуда форму входа гугла и уже оттуда получить канал для обмена данных с сервером.

Я всё правильно понял? Более простых путей нет? Если да, то это довольно грустно, учитывая, что до сего момента я в своей программе успешно обходился и без QtWebkit, и QtWebEngine. Пишут ещё, что в Qt 5.8 появился некий QtNetworkAuth. Но я так понял, что это обёртка над теми же самыми средствами...

★★★★★

Я испытал эту боль, можно идти двумя путями, первый да использовать вызов qt/gtk окна браузера и получать токен от туда или вызывать дефолтный браузер, запускать временно веб сервер и указать redirect_uri как localhost, при это помнить что токен передаётся после якоря, так что на странице локалхоста надо извлечь ключик через js

linux-org-ru ()
Ответ на: комментарий от hobbit

Ну тогда добавлю,

1) - xdg-open https://auchserver/login_page?response_type=token&client_id=464119&
      redirect_uri=http://localhost
2)открывается браузер, пользователь соглашается с условиями и жмёт дальше
3)его после этого автоматически перенаправляют на указанный redirect_uri 
  в загалокве браузера будет http://localhost#access_token=456456456456456sd4f5sd4fsd56f4sdf
4)у тебя уже должен быть запущен временно веб сервер котоый при редиректе на него отдаст страницу с js 
который получит значение после якоря (потому что значения после якоря не отсылаются на сервера)

$(document).ready(function(){
var url = window.location.hash.replace("#","");

теперь url содержит url c токеном без якоря и нужно сделать ещё один GET/POST (как удобнее) запрос к твоему серверу
котрый извлечёт access_token из строки сохранит его куда надо и всё, благополучно завершится.

Но перед завершением можно пользователю страницу отдать мол "Спасибо чувак" ))

linux-org-ru ()
Ответ на: комментарий от linux-org-ru

В общем, копаю в сторону QtNetworkAuth. Делал в целом по этой инструкции, временами подглядывая в официальные примеры. Борюсь с error 400 от гугловского API (redirect URI ему не нравится, почему-то). В борьбе с ней нашёл целое обсуждение. Да, оно переведено ботом, но в переводе нашлась жемчужина:

Я нахожу, но не только документацию, но и графический интерфейс Google api вполне хромой...

...Чего-то ржу и не могу остановиться...

hobbit ★★★★★ ()
Последнее исправление: hobbit (всего исправлений: 2)