¿Cuál es la forma correcta de validar google concedido tokens OAuth en un servidor node.js?

Estoy tratando de autenticar una aplicación móvil para la plataforma Android a un servidor personalizado node.js api. Me gustaría usar los tokens de Google OAuth2 para esto en lugar de rodar mi propia autenticación, ya que los dispositivos Android con Google Play instalados lo ponen a disposición de los desarrolladores de aplicaciones. Estoy utilizando la llamada GoogleAuthUtil.getToken de la biblioteca de Google Play Services, documentada aquí . Estoy tratando de seguir el consejo descrito en este blog de desarrolladores android

El método getToken está devolviendo en mi caso una larga cadena de 857 bytes. Si intento pasar este token al punto final de TokenInfo de Google, devuelve:

{'Error': 'invalid_token', 'error_description': 'Valor no válido'}

¿Qué estoy haciendo mal aquí? En el 'ámbito' de la llamada getToken, estoy enviando: audience:server:client_id:**i_put_my_clientid_here** . Tengo un clientid generado para "aplicaciones instaladas". Utilizando este ID de cliente, la llamada a getToken no funciona en absoluto. Cuando generé un identificador de cliente para una "cuenta de servicio", la llamada tiene éxito, pero obtengo un token de 857 bytes que falla cuando se pasa al punto final de TokenInfo como se describió anteriormente.

EDIT: También he creado un ID de cliente para "aplicaciones web", ya que parece que es el id de cliente adecuado para usar cuando se llama a getToken . Pero el comportamiento es el mismo, recibo un token de 857 bytes que no se valida al llamar al punto final de Google.

¿Cómo puedo obtener correctamente un token de autenticación válido con los servicios de Google Play en Android? Una vez que tenga el token correcto, ¿cuál es la biblioteca node.js correcta para validarla del lado del servidor? ¿Puedo usar passport-google-oauth ?

Si sólo desea leer el contenido de los datos devueltos por GoogleAuthUtil.getToken entonces el proceso es muy simple. Los datos devueltos son simplemente un JWT. Así que todo lo que tienes que hacer es dividir los datos por el . Carácter, y luego base64 (url) descodificar cada pieza.

Se vuelve un poco más complicado si quieres que quieras verificar la autenticidad del mensaje. Simplemente utilice su biblioteca de criptografía favorita para realizar la verificación. El tercer componente del JWT es la firma de los datos y los certificados de Google están disponibles públicamente ; Eso es todo lo que necesita para verificar el mensaje.

Hm, esto es realmente un comentario en lugar de una respuesta, pero no puedo poner nuevas líneas en aquellos:

  1. Tiene que ser el ID de Clent del lado de la red que va en el lugar de put_my_clientid_here
  2. Si GoogleAuthUtil.getToken () le da una cadena sin lanzar una Excepción, realmente debería ser válida. Cuando pulsa tokeninfo, ¿utilizó … tokeninfo? Id_token = <857-byte-value-here>
  3. Si eres un rubyist, toma la gema google-id-token y ver si puede validar su token de 857 bytes.

Durante una semana he estado buscando cómo validar los tokens de GoogleAuthUtil recibidos en la aplicación cliente de Android en el servidor Node.js mediante passport.js

Finalmente me encontré pasaporte-google-token pasaporte estrategia que perfectamente realiza la tarea.

https://www.npmjs.com/package/passport-google-token

Más detalles están presentes en el enlace anterior.

El nodo oficial SDK le permite hacer eso ahora.

Aquí está el enlace: https://github.com/google/google-auth-library-nodejs/blob/master/lib/auth/oauth2client.js#L384

No estoy muy familiarizado con los detalles de cómo funciona Android con respecto a entregar un token desde el dispositivo al servidor. Mi impresión general, sin embargo, es que usted no pasa por la típica danza basada en la web OAuth. En su lugar, llama directamente al punto final de "información del usuario", que devolverá la información correspondiente al usuario que sostiene el token o rechazará la solicitud si el token no es válido. Hay alguna discusión sobre esta cuestión relacionada:

Validando el authToken de Android en un servidor de terceros

En efecto, el token se convierte en un secreto que se comparte entre el dispositivo y el servidor, por lo que es importante protegerlo.

Hay un par de estrategias para Facebook y Twitter que fueron desarrolladas para hacer cosas similares usando fichas de dispositivos iOS:

https://github.com/drudge/passport-twitter-token
https://github.com/drudge/passport-facebook-token

Usted puede tomar una cierta inspiración de ellos y pellizcarlo para hablar con los extremos de Google. Déjeme saber cómo esto resulta. Me encantaría ver una estrategia similar de "pasaporte-google-token", así que si implementas una, déjame saber y voy a enlazar con ella!

  • Cifrado del dispositivo Android ICS
  • AndroidKeystore en la API 4.1
  • Seguridad de PubNub contra una ingeniería inversa de una aplicación android
  • Seguridad de mensajería en nube google
  • Evitar el bloqueo del dispositivo en android mientras mi actividad está en ejecución Y el dispositivo está conectado al cargador
  • Cómo validar el origen de una invocación de servicio web
  • SecurityException: no se permite realizar OP_READ_PHONE_STATE
  • Clave API segura Android
  • Obtener una matriz de char desde el usuario sin utilizar String
  • Pregunta sobre la seguridad del depurador
  • ¿Puedo usar el último proveedor de BouncyCastle en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.