Как пройти проверку подлинности с помощью серверов синхронизации Chrome XMPP?
Мне нужно получить открытые на данный момент вкладки пользователя Google Chrome в моем приложении Java (не на той же машине). Синхронизация Chrome включена, поэтому текущие вкладки синхронизируются с серверами Google.
Согласно документации Chrome, синхронизация осуществляется через XMPP. Поэтому я предполагаю, что должна быть возможность подключиться к серверу Google XMPP (xmpp.google.com), например, через Smack (библиотека Java для XMPP), аутентифицироваться и прослушивать сообщения protobuf, которые указывают на изменение сеанса вкладки. Конечно, доступны учетные данные пользователя или "client_id", которые Chrome использует для идентификации клиентов.
Но мне трудно найти способ аутентификации, который используется для подключения к серверу XMPP, - я не могу понять, как это делается в исходном коде Chromium, и нет никакой документации, кроме очень низкоуровневых комментариев в код. Библиотека libjingle, которую Google использует для своих служб на основе XMPP, доступна только для C++ и плохо поддерживается / задокументирована.
Так есть ли кто-нибудь, кто делал что-то подобное раньше и кто может дать какие-либо советы / подсказки о том, как работает процесс аутентификации?
1 ответ
Я не уверен, что Chrome Sync использует xmpp, по крайней мере, на уровне, когда он должен обмениваться информацией с клиентом. Он использует технологию "буферов протокола" Google. Протокол дается с помощью файлов описания протокола.proto, и вы можете преобразовать его в объекты вашего языка с помощью специального компилятора. Сервер синхронизации, по-видимому, находится по адресу https://clients4.google.com/chrome-sync и клиент отправляет запросы POST с двоичным телом, в которое помещается напечатанное сообщение ClientToServerMessage. Вот вывод при первом подключении к серверу синхронизации. Первый выходной объект Python - это образец переменной WSGI 'environment', в которую также помещаются HTTP-заголовки. Второй объект (после '====') - это фактическое сообщение протокола.
{'CONTENT_LENGTH': '54',
'CONTENT_TYPE': 'application/octet-stream',
'GATEWAY_INTERFACE': 'CGI/1.1',
'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch',
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
'HTTP_AUTHORIZATION': 'GoogleLogin auth=MKhiqZsdz2RV4WrUJzPltxc2smTMcRnlfPALTOpf-Xdy9vsp6yUpS5cGuND0awqrYVUK4lhOJlh6OMsg093eBRghGGIgvWUTzU8PUvquy_c8Xn4sRiz_3tVJcke5eXi3q4qFDa6iVuEbT_0QhyPOjIQyeDOKRpZzMR3rpHsAs0ptFiTtUeTHsoIeUFT9nZPYzkET4-yHbDAp45_dxWdb-U6DPg24',
'HTTP_CONNECTION': 'keep-alive',
'HTTP_HOST': 'localhost:8080',
'HTTP_USER_AGENT': 'Chrome MAC 0.4.21.6 (130497)-devel',
'PATH_INFO': '/chrome-sync/dev/command/',
'QUERY_STRING': 'client_id=SOME_SPECIAL_STRING',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_PORT': '59031',
'REQUEST_METHOD': 'POST',
'SCRIPT_NAME': '',
'SERVER_NAME': 'vian-bizon.local',
'SERVER_PORT': '8080',
'SERVER_PROTOCOL': 'HTTP/1.0',
'SERVER_SOFTWARE': 'gevent/1.0 Python/2.6',
'wsgi.errors': <open file '<stderr>', mode 'w' at 0x100416140>,
'wsgi.input': <gevent.pywsgi.Input object at 0x102a04250>,
'wsgi.multiprocess': False,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'https',
'wsgi.version': (1, 0)}
'==================================='
share: "MY_EMAIL_WAS_HERE@gmail.com"
protocol_version: 30
message_contents: GET_UPDATES
get_updates {
caller_info {
source: NEW_CLIENT
notifications_enabled: false
}
fetch_folders: true
from_progress_marker {
data_type_id: 47745
token: ""
notification_hint: ""
}
}
debug_info {
events {
type: INITIALIZATION_COMPLETE
}
events_dropped: false
}
Это происходит для аутентификации на основе OAuth. Вы можете увидеть токен OAuth в поле HTTP_AUTHORIZATION. Токен OAuth выдается вам при взаимодействии с HTML-диалогом "Вход в учетную запись Google". Я не уверен, но похоже, что API для получения токена доступа к сервисам Google доступен публично.
Если вы вместо этого ищете аутентификацию XMPP, см. Описание механизма аутентификации X-GOOGLE-TOKEN здесь: аутентификация в Google Talk (XMPP, Smack) с использованием authToken
Для авторизации X-OAUTH2 вы можете получить доступ к информации здесь: https://developers.google.com/talk/jep_extensions/oauth
И образец здесь: http://pits.googlecode.com/svn/trunk/xmpp.c
Обратите внимание, что вы можете добавить поток потока XMPP к файлам журнала Chrome, заполняемым при каждом запуске браузера - chrome_debug.log. Чтобы включить это, запустите Chrome со следующими параметрами: --enable-logging --v=2