Verificación de Google OAuth con nodo Gmail: ¿cómo pasar la verificación cuando GmailOAuth2Api obliga 6 scopes?

Hola a todos,

Estoy construyendo un asistente de correo electrónico con IA autohospedado con n8n para pequeñas empresas y actualmente me estoy preparando para la verificación de OAuth de Google.

El flujo de trabajo:

  • Lee mensajes de Gmail sin leer
  • Filtra correos electrónicos automatizados
  • Envía el contenido a Claude
  • Crea borradores de Gmail
  • Marca el mensaje como leído solo después del procesamiento exitoso
  • Envía un resumen de ejecución

La aplicación nunca elimina permanentemente correos electrónicos.

Lo que encontré

Después de investigar, descubrí que la credencial nativa de Gmail OAuth2 API tiene sus alcances codificados.

Siempre solicita:

  • gmail.labels
  • gmail.addons.current.action.compose
  • gmail.addons.current.message.action
  • mail.google.com
  • gmail.modify
  • gmail.compose

La propiedad Scope está oculta, por lo que no hay forma de personalizarla desde la interfaz de usuario.

También encontré discusiones comunitarias que muestran que simplemente restringir los alcances en Google Cloud causa que la autorización de OAuth falle con HTTP 403 porque la credencial de Gmail sigue solicitando la lista de alcances codificados completa.

También hay una solicitud de función abierta pidiendo que el nodo de Gmail admita la credencial genérica de Google OAuth en lugar de la credencial de Gmail fija.

Mi pregunta

¿Ha completado alguien aquí la verificación de OAuth de Google mientras mantiene el nodo nativo de Gmail?

Si es así:

  • ¿Google aceptó los alcances codificados predeterminados?
  • ¿Tuvo que justificar mail.google.com?
  • ¿Google solicitó algún cambio?

¿O terminó reemplazando los nodos de Gmail con nodos de HTTP Request utilizando una credencial genérica de Google OAuth2 y la API REST de Gmail?

No estoy buscando consejos teóricos: me gustaría mucho recibir comentarios de alguien que haya completado exitosamente el proceso de verificación de Google con una aplicación n8n en producción.

¡Gracias!

Comparte tu flujo de trabajo

(Selecciona los nodos en tu lienzo y usa los atajos de teclado CMD+C/CTRL+C y CMD+V/CTRL+V para copiar y pegar el flujo de trabajo.)

Comparte el resultado devuelto por el último nodo

Información sobre tu configuración de n8n

  • versión de n8n: “localhost”
  • Base de datos (predeterminada: SQLite):
  • Configuración EXECUTIONS_PROCESS de n8n (predeterminada: own, main):
  • Ejecutando n8n a través de (Docker, npm, n8n cloud, aplicación de escritorio): DOCKER
  • Sistema operativo:

Hola @Jidenkaes
El problema no son los seis scopes como grupo, sino que el nodo nativo de Gmail codifica https://mail.google.com/, un scope restringido (acceso completo, incluyendo eliminación permanente). Ese único scope es lo que te coloca en la pista de scope restringido de Google: la evaluación de seguridad de terceros anual, además de que los revisores rechacen una solicitud de acceso completo de una aplicación que solo lee, redacta y marca como leído.

Todo tu flujo de trabajo (leer no leído, crear borradores, eliminar la etiqueta UNREAD) cabe dentro de un scope, gmail.modify. Google lo clasifica como sensible en lugar de restringido, específicamente porque no puede eliminar correo de forma permanente, lo que el tuyo nunca hace. Eso te mantiene en la verificación de scope sensible más ligera en lugar de la restringida, y te da una justificación clara de menor privilegio.

El nodo de Gmail no te permite recortar sus scopes, así que reemplaza esos nodos con nodos de HTTP Request que coqueten con la API REST de Gmail, autenticados con una credencial genérica de Google OAuth2 donde ingresas el scope tú mismo:

https://www.googleapis.com/auth/gmail.modify

Gracias, eso es muy útil. Solo para aclarar: ¿has completado personalmente la verificación OAuth de Google utilizando el enfoque HTTP Request + OAuth2 genérico de Google, o es la arquitectura que recomendarías? Estoy tratando de determinar si alguien ha pasado exitosamente la revisión de Google con esta configuración.