Google oauth2 se hace pasar por la cuenta de servicio con [email protected]

Quería acceder a algunos servicios de API de Google:

API de GDriveAPI de contactoAPI de personas

Y estoy luchando con el flujo de la cuenta del servicio de suplantación de identidad de oauth2 (ya lo sabes:Google Oauth v2 - descripción de la cuenta de servicio. Para la suplantación, debe aplicar la "Delegación de autoridad en todo el dominio" en la consola de aplicaciones de Google, descargar el archivo pk12 correspondiente y activar la API en un proyecto de consola de Google.

Por el momento siempre obtengo:

com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489)
at oauthsample.GDriveAPI.<init>(GDriveAPI.java:50)
at oauthsample.GDriveAPI.main(GDriveAPI.java:85)

Aquí está mi código:

        HttpTransport httpTransport = new NetHttpTransport();
        JacksonFactory jsonFactory = new JacksonFactory();    

        Set<String> scopes = new HashSet<String>();
        scopes.add("https://www.google.com/m8/feeds");

        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(JSON_FACTORY)
                .setServiceAccountId("[email protected]")
                .setServiceAccountPrivateKeyFromP12File(new File("somep12key.p12"))
                .setServiceAccountScopes(scopes)
                .setServiceAccountUser("[email protected]")
                .build();

       credential.refreshToken();
       ContactsService service = new ContactsService("MYAPP");
        service.getRequestFactory().setHeader("User-Agent", "MYAPP");
        service.setHeader("GData-Version", "3.0");
        service.setOAuth2Credentials(credential);

        URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full");
        ContactFeed resultFeed = service.getFeed(feedUrl, ContactFeed.class);

También busqué mucho en stackoverflow (no puedo enumerar todas las referencias y verifiqué las respuestas y soluciones). Pero una pregunta nunca fue respondida claramente, ni en la documentación de Google ni en todas las publicaciones de stackoverflow:

¿Es realmente posible suplantar una cuenta de servicio con un usuario normal de [email protected] (me refiero a una cuenta normal de gmail sin acceso a la consola de administración mencionada en el capítulo "Delegar autoridad de todo el dominio a la cuenta de servicio" y sin tener un dominio propio)?

Algunos dicen que sí, otros dicen que no. Entonces, ¿cuál es la verdad absoluta?

Según tengo entendido al leer los documentos de Google: la cuenta de servicio solo puede hacerse pasar por usuarios cuando usted está a cargo de un dominio propio y necesita tener una cuenta de Google Work con su propio dominio registrado. Luego puede acceder a la consola de administración y puede otorgar acceso a la cuenta de servicio.

Gracias por su paciencia y por su tiempo para responder.

Saludos cordiales Matt

Respuestas a la pregunta(1)

Su respuesta a la pregunta