12

Java アプリケーション (同じマシン上ではない) で Google Chrome ユーザーの現在開いているタブを取得する必要があります。Chrome 同期が有効になっているため、現在のタブは Google サーバーと同期されます。

Chrome 同期のドキュメントによると、XMPP 経由で行われます。したがって、Smack (XMPP の Java ライブラリ) などを介して Google XMPP サーバー (xmpp.google.com) に接続し、タブ セッションの変更を示す protobuf メッセージを認証してリッスンできるはずです。もちろん、ユーザーのログイン資格情報または Chrome がクライアントを識別するために使用する「client_id」は利用可能です。

しかし、XMPP サーバーへの接続に使用される認証方法を理解するのに苦労しています。Chromium のソース コードでそれがどのように行われているかがわかりません。コード。Google が XMPP ベースのサービスに使用する libjingle ライブラリは、C++ でのみ利用可能であり、十分に管理/文書化されていません。

それで、以前にそのようなことをしたことがあり、認証プロセスがどのように機能するかについてアドバイス/ヒントを与えることができる人はいますか?

4

1 に答える 1

9

少なくともクライアントと情報を交換する必要があるレベルでは、chrome sync が xmpp を使用しているかどうかはわかりません。「プロトコル バッファ」Google テクノロジーを使用します。プロトコルは .proto プロトコル記述ファイルを使用して指定され、特別なコンパイラを使用して言語のオブジェクトに変換できます。同期サーバーはhttps://clients4.google.com/chrome-syncにあるようで、クライアントは、入力された ClientToServerMessage メッセージが配置されるバイナリ本文で POST 要求を送信します。これは、同期サーバーに最初に接続したときの出力です。最初の出力 Python オブジェクトは、HTTP ヘッダーも配置される 'environ' WSGI 変数の pprint です。2 番目のオブジェクト ('====' の後) は、実際のプロトコル メッセージです。

{'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 ベースの認証で発生します。HTTP_AUTHORIZATION フィールドに OAuth トークンが表示されます。OAuth トークンは、HTML ダイアログの [Google アカウント ログイン] を操作すると提供されます。よくわかりませんが、Google サービスのアクセス トークンを取得するための API が公開されているようです。

代わりに XMPP 認証を探している場合は、こちらの X-GOOGLE-TOKEN 認証メカニズムの説明を参照してください: authToken を使用して Google トーク (XMPP、Smack) に認証する

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

于 2012-07-30T14:08:44.650 に答える