¿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:
- ¿Cuál es la mejor manera de ocultar la contraseña de keystore en Android?
- Usar bloqueo de pantalla en mi aplicación
- Seguridad de SharedPreference de Android
- Android: el resultado de AsyncTask no se devuelve a la actividad principal
- ¿Qué protege las contraseñas de AccountManager de Android de ser leídas por otras aplicaciones?
{'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 ?
- Asegurar cadena en APK
- ¿Qué tan seguro acceder a mi aplicación de Android con facebook-id?
- ¿Hay análogos javax.smartcardio en Android?
- ¿Cómo debo codificar para resistir la "piratería con un solo clic"?
- Protección de las claves de twitter en Android
- Android cifrar / descifrar sqlite base de datos 100% seguro
- ¿Qué tan seguras son las API de GeoLocation en dispositivos móviles?
- Proteger la cadena constante contra la ingeniería inversa
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:
- Tiene que ser el ID de Clent del lado de la red que va en el lugar de put_my_clientid_here
- 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>
- 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!
- Usando COLLATE en Android SQLite – Locales se ignora en la instrucción LIKE
- Android dibuja texto en rectángulo en el centro y recórtalo si es necesario