¿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!

  • Keytool's -storepass vs. -keypass - ¿Por qué 2 contraseñas?
  • Obtener una matriz de char desde el usuario sin utilizar String
  • Prevención de la piratería de la aplicación android
  • ¿Cómo puedo validar un android.net.http.SsLCertificate con un X509TrustManager?
  • ¿Es posible escribir un wifi cracking util para teléfonos Android? Modo de monitor vs Multicast?
  • Android RSA Generación de pares de claves - ¿Debo usar Java estándar / Bouncy Castle / Spongy Castle / JSch / Other?
  • Acceso exclusivo al micrófono en Android
  • ¿Cómo puedo importar un certificado de la CA en Android 4.4.2 en el emulador?
  • Uso de Android Fingerprint API para comprobar si se ha agregado una nueva huella digital
  • Java: ¿Cómo puedo generar PrivateKey de una cadena?
  • Cómo proteger mi aplicación contra la piratería
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.