2012-07-17 19 views
11

Necesito obtener las pestañas actualmente abiertas de un usuario de Google Chrome en mi aplicación Java (no en la misma máquina). La sincronización de Chrome está habilitada para que las pestañas actuales se sincronicen con los servidores de Google.¿Cómo autenticarse con los servidores XMPP de sincronización de Chrome?

Según el documentation de la sincronización de Chrome, se realiza a través de XMPP. Así que supongo que debería ser posible conectarse al servidor de Google XMPP (xmpp.google.com), p. a través de Smack (biblioteca Java para XMPP), autentica y escucha los mensajes protobuf que indican un cambio en la sesión de pestañas. Por supuesto, las credenciales de inicio de sesión del usuario o el "cliente_id" que Chrome usa para identificar clientes están disponibles.

Pero me está costando retrasar el método de autenticación que se usa para conectarme al servidor XMPP. No puedo entender cómo se hace en el Chromium source code y no hay documentación disponible además de la muy baja. comentarios de nivel en el código. La biblioteca libjingle que Google utiliza para sus servicios basados ​​en XMPP solo está disponible para C++ y no está bien mantenida/documentada.

Entonces, ¿hay alguien que haya hecho algo así antes y que pueda dar algún consejo/pista sobre cómo funciona el proceso de autenticación?

Respuesta

9

No estoy seguro de que la sincronización de Chrome use xmpp, al menos en el nivel cuando tiene que intercambiar información con el cliente. Utiliza la tecnología Google de "buffer de protocolo". El protocolo se proporciona mediante el uso de archivos de descripción de protocolo .proto y puede convertirlo a los objetos de su idioma mediante el uso de un compilador especial. El servidor de sincronización parece descansar en https://clients4.google.com/chrome-sync y el cliente envía solicitudes POST con el cuerpo binario donde se coloca el mensaje tipeado ClientToServerMessage. Aquí está la salida desde la primera conexión al servidor de sincronización. El primer objeto Python de salida es una impresión de la variable WSGI 'environ' donde también se colocan los encabezados HTTP. El segundo objeto (después de '====') es un mensaje de protocolo real.

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

Esto sucede para la autenticación basada en OAuth. Puede ver el token de OAuth en el campo HTTP_AUTHORIZATION. El token de OAuth se le proporciona cuando interactúa con el cuadro de diálogo HTML 'Inicio de sesión de cuenta de Google'. No estoy seguro, pero parece que la API para obtener un token de acceso para los servicios de Google está disponible públicamente.

Si usted está buscando XMPP auth lugar, consulte la descripción del mecanismo de autenticación X-GOOGLE-TOKEN aquí: Authenticate to Google Talk (XMPP, Smack) using an authToken

Para la autorización X-OAuth2, puede acceder a la información aquí: https://developers.google.com/talk/jep_extensions/oauth

Y una muestra aquí: http://pits.googlecode.com/svn/trunk/xmpp.c

Tenga en cuenta que puede agregar flujo de la corriente XMPP a los archivos de registro de Chrome pobladas en cada ejecución del navegador - chrome_debug.log. Para habilitar esto, ejecute Chrome con las siguientes opciones: --enable-logging --v = 2

+0

¡Gracias por su respuesta! También noté que Chrome se conectaba a ese servidor, pero creo que solo es para suscribirse a las notificaciones de sincronización a través de XMPP o para registrar ese cliente/navegador con los servidores de sincronización. Leí en una presentación de Google que la sincronización de pestañas se realiza a través de XMPP para minimizar la carga y la complejidad del servidor (imagínense 10 millones de navegadores Chrome sondeando un servidor cada minuto para verificar las actualizaciones de sincronización). Pero creo que tienes razón y que los mensajes XMPP son protobuffs, algo con lo que tengo que lidiar tan pronto como me conecto a los servidores ... –

+0

¿Has logrado conectarte a xMPp de sincronización cromática usando Smack? ¿Cómo se obtiene la ficha de Oauth? – rustyx

+0

@rustyx: No, lamentablemente no he ... // no he notado vians edit hasta ahora - ¡muchas gracias, voy a ver esto! –

Cuestiones relacionadas