¿Podemos acceder a GMAIL API usando la cuenta de servicio?

Tengo una aplicación de escritorio para leer el correo usando GMAIL API sobre la interfaz REST. Deseo usar la cuenta de servicio para poder descargar los correos usando la configuración de dominio y la interacción del usuario es nula. Pude crear con éxito la instancia del servicio de Gmail, pero cuando bash acceder a cualquier método de la API de Gmail, como buscar una lista de correo o cualquier otra, recibo una excepción que dice:

Google.Apis.Auth.OAuth2.Responses.TokenResponseException: Error: “access_denied”, Descripción: “Cliente solicitado no autorizado”.

Terminé con todos los ajustes en la consola de desarrollador y agregué scopes a mi dominio gapps.

¿La API de Gmail admite la cuenta de servicio? Usando la misma cuenta de configuración y servicio, puedo obtener una lista de todos los archivos en la unidad de Google usando el servicio y la API de Drive.

Uso el siguiente código C # para acceder a Gmail desde la cuenta de servicio

String serviceAccountEmail = "999999999-9nqenknknknpmdvif7onn2kvusnqct2c@developer.gserviceaccount.com"; var certificate = new X509Certificate2( AppDomain.CurrentDomain.BaseDirectory + "certs//fe433c710f4980a8cc3dda83e54cf7c3bb242a46-privatekey.p12", "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable); string userEmail = "user@domainhere.com.au"; ServiceAccountCredential credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(serviceAccountEmail) { User = userEmail, Scopes = new[] { "https://mail.google.com/" } }.FromCertificate(certificate) ); if (credential.RequestAccessTokenAsync(CancellationToken.None).Result) { GmailService gs = new GmailService( new Google.Apis.Services.BaseClientService.Initializer() { ApplicationName = "iLink", HttpClientInitializer = credential } ); UsersResource.MessagesResource.GetRequest gr = gs.Users.Messages.Get(userEmail, msgId); gr.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw; Message m = gr.Execute(); if (gr.Format == UsersResource.MessagesResource.GetRequest.FormatEnum.Raw) { byte[] decodedByte = FromBase64ForUrlString(m.Raw); string base64Encoded = Convert.ToString(decodedByte); MailMessage msg = new MailMessage(); msg.LoadMessage(decodedByte); } } 

Si quieres “leer el correo”, necesitarás la API de Gmail más nueva (no la antigua API de configuración de administración que ‘perdió en binario’). Sí, puedes hacer esto con oauth2 y la API de Gmail más nueva, necesitas incluir en la lista blanca al desarrollador en Cpanel y crear una clave con la que puedas firmar tus solicitudes; lleva un poco configurarlo: https://developers.google.com / accounts / docs / OAuth2ServiceAccount # formingclaimset

Sí, puedes … verificar la configuración de la delegación …

https://developers.google.com/admin-sdk/directory/v1/guides/delegation#delegate_domain-wide_authority_to_your_service_account

Editar: usa el enlace que Eric DeFriez compartió.

Puede acceder a cualquier correo de usuario@YOUR_DOMAIN.COM correos / tags / hilos, etc. con la nueva API de Gmail:

https://developers.google.com/gmail/api/

a través de una cuenta de servicio con suplantación (la cuenta de servicio está accediendo a la API como si fuera un usuario específico de su dominio).

Consulte los detalles aquí: https://developers.google.com/identity/protocols/OAuth2ServiceAccount

Aquí hay un código relevante en Dartlang:

 import 'package:googleapis_auth/auth_io.dart' as auth; import 'package:googleapis/gmail/v1.dart' as gmail; import 'package:http/http.dart' as http; ///credentials created with service_account here https://console.developers.google.com/apis/credentials/?project=YOUR_PROJECT_ID final String creds = r''' { "private_key_id": "FILL_private_key_id", "private_key": "FILL_private_key", "client_email": "FILL_service_account_email", "client_id": "FILL_client_id", "type": "service_account" }'''; Future createImpersonatedClient(String impersonatedUserEmail, List scopes) async { var impersonatedCredentials = new auth.ServiceAccountCredentials.fromJson(creds,impersonatedUser: impersonatedUserEmail); return auth.clientViaServiceAccount(impersonatedCredentials , scopes); } getUserEmails(String userEmail) async { //userEmail from YOUR_DOMAIN.COM var client = await createImpersonatedClient(userEmail, [gmail.GmailApi.MailGoogleComScope]); var gmailApi = new gmail.GmailApi(client); return gmailApi.users.messages.list(userEmail, maxResults: 5); } 
Intereting Posts