Я пытаюсь использовать учетную запись службы для синхронизации календарей из программного обеспечения Dynamics CRM в Google. Во время этого я столкнулся с отсутствием документации по API Google для .net, особенно в отношении авторизации. Большинство образцов Google нельзя даже скомпилировать из-за устаревших библиотек и классов.
Итак, я нашел пример над интернированным и получил ошибку. Может ли кто-нибудь посмотреть мой образец и сказать, что я делаю неправильно?
Подготовительные шаги:
- Я создал проект в своей личной учетной записи Google.
- В консоли разработчика проекта в разделе APIS и AUTH → Credentials я создал учетную запись службы. Затем нажмите "Создать ключ P12" и загрузите файл .p12.
- В APIS и AUTH → API, включен "API календаря"
Затем создалось консольное приложение и удалось установить пакеты OAuth и Calendar nuget. Есть:
- Клиентская библиотека API Google API, Google.Apis.Auth 1.8.1
- Клиентская библиотека API Google API, Google.Apis 1.8.1
- Основная клиентская библиотека API Google API, Id: Google.Apis.Core 1.8.1
- Google.APIs.Calendar.v3 Клиентская библиотека, Google.Apis.Calendar.V3 1.8.1.860
Код найден и адаптирован к моим потребностям:
using System;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Calendar.v3;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
namespace CrmToGoogleCalendar
{
class Program
{
static void Connect()
{
var certificate = new X509Certificate2("My Project-ee7facaa2bb1.p12", "notasecret", X509KeyStorageFlags.Exportable);
var serviceAccountEmail = "[email protected]account.com";
var userAccountEmail = "<my email>@gmail.com";
var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
User = userAccountEmail,
Scopes = new[] { CalendarService.Scope.Calendar }
}
.FromCertificate(certificate));
var service = new CalendarService(new BaseClientService.Initializer()
{
ApplicationName = "Test calendar sync app",
HttpClientInitializer = credential
});
var calList = service.CalendarList.List().Execute().Items;
foreach (var cal in calList)
{
Console.WriteLine(cal.Id);
}
}
static void Main(string[] args)
{
Connect();
}
}
}
Общение с Google API, которое я вижу в приложении и Fiddler, это:
Запрос:
Host: HTTPS accounts.google.com, URL:/o/oauth2/token
Утверждение: длинная двоичная строка
grant_type: urn: ietf: params: oauth: grant-type: jwt-bearer
Ответ:
HTTP/1.1 400 Плохой запрос Content-Type: application/json Cache-Control: no-cache, no-store, max-age = 0, must-revalidate Pragma: no-cache Истекает: Пт, 01 янв 1990 00:00:00 GMT Дата: Чт, 24 июл 2014 06:12:18 GMT X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode = block Сервер: альтернативный протокол GSE: 443: quic Transfer-Encoding: chunked
1f { "error": "invalid_grant" } 0
Пожалуйста, помогите и спасибо заранее!