2012-07-17 3 views
11

Java 응용 프로그램 (동일한 컴퓨터가 아닌)에서 Google 크롬 사용자의 현재 열린 탭을 가져와야합니다. 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

크롬 동기화가 클라이언트와 정보를 교환해야 할 때 적어도 레벨에서 xmpp을 사용하는지 모르겠습니다. 그것은 '프로토콜 버퍼'Google 기술을 사용합니다. 프로토콜은 .proto 프로토콜 설명 파일을 사용하여 제공되며 특수 컴파일러를 사용하여 언어 개체로 변환 할 수 있습니다. 동기화 서버는 https://clients4.google.com/chrome-sync에 있으며 클라이언트는 입력 된 ClientToServerMessage 메시지가있는 바이너리 본문과 함께 POST 요청을 보냅니다. 먼저 동기화 서버에 연결할 때의 출력입니다. 첫 번째 출력 파이썬 객체는 HTTP 헤더가있는 'environ'WSGI 변수의 pprint입니다. 두 번째 객체 ('===='다음)는 실제 프로토콜 메시지입니다.

{'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 토큰의 인증 메커니즘의 설명을 참조하시기 바랍니다 찾고 있다면 : https://developers.google.com/talk/jep_extensions/oauth

다음 X-OAUTH2 허가를 Authenticate to Google Talk (XMPP, Smack) using an authToken

을, 당신은 여기에 정보에 액세스 할 수 있습니다

그리고 여기 샘플 : 브라우저의 각 실행에 채워 크롬 로그 파일에 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 : 아니, 슬프게도 나는 ... // vians가 지금까지 편집하는 것을 눈치 채지 못했습니다. - 고마워요. –

관련 문제