2012-07-17 23 views
11

Java uygulamamda bir Google Chrome kullanıcısının şu anda açılmış sekmelerini almam gerekiyor (aynı makinede değil). Chrome senkronizasyonu etkin olduğundan, mevcut sekmeler Google sunucularla senkronize edilir.Chrome senkronizasyon XMPP sunucularında nasıl kimlik doğrulama yapılır?

Chrome senkronizasyonunun documentation'a göre, XMPP üzerinden yapılır. Dolayısıyla, Google XMPP sunucusuna (xmpp.google.com), ör. Smack (XMPP için Java kütüphanesi) aracılığıyla, bir sekme oturum değişikliğini gösteren protobuf mesajlarını doğrulayın ve dinleyin. Elbette, kullanıcının giriş kimlik bilgileri veya müşterileri bulmak için "client_id" Chrome kullanılır.

Ancak XMPP sunucusuna bağlanmak için kullanılan kimlik doğrulama yönteminin arkasına geçmekte zorlanıyorum - Chromium source code'da nasıl yapıldığını anlayamıyorum ve çok düşük bir belgenin yanı sıra kullanılabilir belge yok koddaki seviye yorumları. Google'ın kullandığı libjingle kütüphanesi XMPP tabanlı hizmetler yalnızca C++ için kullanılabilir ve iyi bakılmamış/belgelenmemiş.

Daha önce böyle bir şey yapan ve kimlik doğrulama sürecinin nasıl işlediğine dair tavsiyede/ipucu verebilen biri var mı?

cevap

9

Emin değilim chrome eşitleme en azından istemci ile bilgi alışverişinde olması gereken düzeyde xmpp kullanır. 'Protokol tamponları' Google teknolojisini kullanır. Protokol, .proto protokolü tanım dosyaları kullanılarak verilir ve özel derleyici kullanarak dilinizin nesnelerine dönüştürebilirsiniz. Senkronizasyon sunucusu https://clients4.google.com/chrome-sync numaralı telefondan dinleniyor ve istemci, POST isteklerini, yazılan ClientToServerMessage mesajının yerleştirildiği ikili gövdeye gönderir. İlk önce senkronizasyon sunucusuna bağlandığınız zamanki çıktı. İlk çıktı Python nesnesi, HTTP başlıklarının da yerleştirildiği “ortam” WSGI değişkeninin bir pprintidir. İkinci nesne ('====' dan sonra) gerçek protokol mesajıdır.

{'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 
} 

Bu, OAuth tabanlı kimlik doğrulaması için olur. HTTP_AUTHORIZATION alanındaki OAuth belirtecini görebilirsiniz. HTML diyalogu 'Google Hesabı Girişi' ile etkileşime girdiğinizde OAuth jetonu size verilir. Emin değilim, ancak Google hizmetleri için erişim belirteci almanın API’nın herkese açık olması gibi görünüyor.

Eğer XMPP kimlik doğrulama yerine, burada X-GOOGLE-TOKEN yetkilendirme mekanizmasının açıklamasına bakınız arıyorsanız: https://developers.google.com/talk/jep_extensions/oauth

: X-OAuth2 yetkilendirme için Authenticate to Google Talk (XMPP, Smack) using an authToken

, buradan bilgi erişebilir

Ve burada bir örnek: tarayıcının her kaçak doldurulan Krom günlük dosyalarına XMPP akışı akışını ekleyebilir http://pits.googlecode.com/svn/trunk/xmpp.c

Not - chrome_debug.log. Bunu etkinleştirmek için Chrome'u aşağıdaki seçeneklerle çalıştırın: --enable-logging --v = 2

+0

Cevabınız için teşekkürler! Chrome'un bu sunucuya bağlandığını da fark ettim, ancak yalnızca XMPP aracılığıyla bildirimleri senkronize etmeyi veya söz konusu istemciyi/tarayıcıyı senkronizasyon sunucularıyla kaydetmeyi beklediğimi düşünüyorum. Bir Google sunumunda, sunucu yüklemesini ve karmaşıklığı en aza indirmek için sekme senkronizasyonunun XMPP aracılığıyla yapıldığını okudum (yalnızca senkronizasyon güncellemelerini kontrol etmek için her dakikada bir sunucuda 10 milyon Chrome tarayıcısı yoklamayı düşünün). Ama haklısınız ve XMPP mesajlarının protobuffs olduğunu düşünüyorum - sunuculara bağlandığım anda başa çıkmam gereken bir şey var… –

+0

Smack'i kullanarak chrome sync xmpp'ye bağlanmayı başardınız mı? Oauth belirtecini nasıl edinirsiniz? – rustyx

+0

@rustyx: Hayır, ne yazık ki ben de… // simgelerin şu ana kadar düzenlemediğini farketmedik - çok teşekkürler, buna bakacağım! –

İlgili konular