Можем ли мы получить доступ к GMAIL API с помощью учетной записи службы?
У меня есть настольное приложение для чтения почты с помощью API GMAIL через интерфейс REST. Я хочу использовать учетную запись службы, чтобы мы могли загружать письма, используя настройку домена, а взаимодействие с пользователем равно null. Я успешно могу создать экземпляр службы Gmail, но когда я пытаюсь получить доступ к любому методу API Gmail, например, получение списка почты или любого другого, я получаю исключение
Google.Апис.Автор.Что OAuth2.Ответы.Исключение TokenResponseException: Ошибка:"access_denied", Описание: "запрошенный клиент не уполномоченный."
Я закончил со всеми настройками в консоли разработчика и добавил области в мой домен gapps.
поддерживает ли Gmail API учетную запись службы? Используя ту же настройку и учетную запись службы, я могу получить список всех файлов на Google диске с помощью сервиса дисков и API.
4 ответов
Я использую следующий код C# для доступа к Gmail из учетной записи службы
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);
}
}
Если вы хотите "читать почту", вам понадобится новый API Gmail (а не более старый API настроек администратора, который "потерян в двоичном файле"). Да, вы можете сделать это с помощью oauth2 и более нового API Gmail, вам нужно белый список разработчика в Cpanel и создать ключ, который вы можете подписать свои запросы с--это займет немного времени, чтобы настроить: https://developers.google.com/accounts/docs/OAuth2ServiceAccount#formingclaimset
вы можете получить доступ к любому user@YOUR_DOMAIN.COM почты / ярлыки / потоки etc. с новым API Gmail:
https://developers.google.com/gmail/api/
via учетная запись службы с олицетворения (учетная запись службы обращается к api, как если бы это был конкретный пользователь из вашего домена).
подробности смотрите здесь:https://developers.google.com/identity/protocols/OAuth2ServiceAccount
вот соответствующий код в Дартланг:
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<http.Client> 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);
}