playground google funciona como cliente apis authentication oauth-2.0 silent google-groups-api

authentication - funciona - Autorización no interactiva con Google OAuth2



id oauth google (1)

Encontré solución. El problema es que la clave JSON generada por Google no configura el usuario de la cuenta de servicio. Tienes que hacerlo manualmente así:

GoogleCredential cr = GoogleCredential .fromStream(new FileInputStream(keyFile)) .createScoped(SCOPES); GoogleCredential.Builder builder = new GoogleCredential.Builder() .setTransport(httpTransport) .setJsonFactory(jsonFactory) .setServiceAccountScopes(SCOPES) .setServiceAccountId(cr.getServiceAccountId()) .setServiceAccountPrivateKey(cr.getServiceAccountPrivateKey()) .setServiceAccountPrivateKeyId(cr.getServiceAccountPrivateKeyId()) .setTokenServerEncodedUrl(cr.getTokenServerEncodedUrl()) .setServiceAccountUser(user); Directory directory = new Directory.Builder( httpTransport, jsonFactory, builder.build()) .setApplicationName(config.getProperty("google.application.name")).build();

Creé una aplicación Java que realiza la sincronización de MS Active Directory con Google Groups. Es una aplicación no interactiva que se supone debe ser ejecutada por el cronjob en la noche. Funciona perfectamente en mi computadora portátil (entorno DEV). Mi problema es que en la primera ejecución aparece la ventana del navegador con el cuadro de diálogo que solicita autorizar el acceso a la API de Google. Después de hacer clic en el botón "Permitir", felizmente continúa hasta el final. Ahora necesito moverlo al servidor de producción que ejecuta CentOS y no tiene un navegador. Cuando ejecuto mi aplicación en este entorno, imprime el siguiente mensaje:

Please open the following address in your browser: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=520105804541-c7d7bfki88qr8dbkv6oahp22i3oq1jq0.apps.googleusercontent.com&redirect_uri=http://localhost:50089/Callback&response_type=code&scope=https://www.googleapis.com/auth/admin.directory.group.member%20https://www.googleapis.com/auth/admin.directory.orgunit%20https://www.googleapis.com/auth/admin.directory.device.mobile.action%20https://www.googleapis.com/auth/admin.directory.orgunit.readonly%20https://www.googleapis.com/auth/admin.directory.userschema%20https://www.googleapis.com/auth/admin.directory.device.chromeos%20https://www.googleapis.com/auth/admin.directory.notifications%20https://www.googleapis.com/auth/admin.directory.device.chromeos.readonly%20https://www.googleapis.com/auth/admin.directory.device.mobile%20https://www.googleapis.com/auth/admin.directory.group.readonly%20https://www.googleapis.com/auth/admin.directory.group.member.readonly%20https://www.googleapis.com/auth/admin.directory.userschema.readonly%20https://www.googleapis.com/auth/admin.directory.user.alias%20https://www.googleapis.com/auth/admin.directory.user.security%20https://www.googleapis.com/auth/admin.directory.device.mobile.readonly%20https://www.googleapis.com/auth/admin.directory.user%20https://www.googleapis.com/auth/admin.directory.user.readonly%20https://www.googleapis.com/auth/admin.directory.user.alias.readonly%20https://www.googleapis.com/auth/admin.directory.group%20https://www.googleapis.com/auth/apps.groups.settings

No hay un navegador en esta máquina, pero si intento ejecutarlo en otra casilla, recibo el error 400, solicitud no válida. La razón es clara, porque redirige a localhost: 50089 y nadie está escuchando en ese puerto en otra máquina. Pasando por los múltiples documentos y muestras en developers.google.com, encontré una forma de eludir el diálogo creando la cuenta de servicio y generando una clave principal para ella.

try { GoogleCredential cr = GoogleCredential .fromStream(new FileInputStream(keyFile)) .createScoped(SCOPES); Directory directory = new Directory.Builder(httpTransport, jsonFactory, cr) .setApplicationName(config.getProperty("google.application.name")).build(); } catch (IOException ex) { LOG.error("Failed to establish access credentials : ", ex.getMessage()); }

Lee la clave y crea una instancia de Directorio, pero cualquier solicitud a ella da como resultado un código de respuesta 403

{"código": 403, "errores": [{"dominio": "global", "mensaje": "No autorizado para acceder a este recurso / api", "razón": "prohibido")
}], "mensaje": "No autorizado para acceder a este recurso / api"} "

Pero he delegado todos los privilegios para esta cuenta en la cuenta de servicio. No sé qué más puedo hacer. Si alguien puede ayudarme a salir de este aprieto, lo agradezco mucho.