2012-07-17 6 views
11

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

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

しかし、私はXMPPサーバーに接続するために使用される認証方法に苦労しています。これはChromium source codeでどのように行われたのかわかりませんし、コード内のレベルのコメント。 GoogleがXMPPベースのサービスで使用するlibjingleライブラリは、C++でのみ利用可能で、よく管理されていない/文書化されていません。

これまでのようなことをして、認証プロセスの仕組みに関するアドバイスやヒントを与えることができる人はいますか?

答えて

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: "[email protected]" 
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の認証メカニズムの説明を参照してくださいを探している場合:https://developers.google.com/talk/jep_extensions/oauth

:X-のOAuth2認証のために ​​

を、あなたはここで情報にアクセスすることができます

そして、ここでサンプル:あなたは、ブラウザの各実行に埋めクロームログファイルにXMPPストリームフローを追加することができますhttp://pits.googlecode.com/svn/trunk/xmpp.c

注 - chrome_debug.log。これを有効にするには、次のオプションを使用してChromeを実行します。--enable-logging --v = 2

+0

返信いただきありがとうございます。私はまた、そのサーバーに接続しているChromeに気づいたが、XMPP経由で同期通知を購読するか、そのクライアント/ブラウザを同期サーバーに登録するだけだと思う​​? Googleのプレゼンテーションでは、サーバーの負荷や複雑さを最小限に抑えるためにXMPP経由でタブの同期が行われていることを読んでいます(同期の更新を確認するために毎分1千万のChromeブラウザが毎分サーバーをポーリングするとします)。しかし、私はあなたが正しいと思うし、XMPPメッセージはprotobuffs - 私はサーバーに接続するとすぐに対処しなければならないもの... –

+0

Smackを使ってchrome sync xmppに接続できましたか?どのようにoauthトークンを取得しますか? – rustyx

+0

@rustyx:いいえ、悲しいことに私はいない... //ビヨンは今まで編集していませんでした - ありがとう、私はこれを調べます! –

関連する問題