Google API OAuth2, Сервисный аккаунт, «ошибка»: «invalid_grant»

Я пытаюсь использовать служебную учетную запись для синхронизации календарей из программного обеспечения Dynamics CRM в Google. Во время этого я столкнулся с отсутствием документации по API Google для .net, особенно в отношении авторизации. Большинство примеров Google не могут быть скомпилированы даже из-за устаревших библиотек и используемых классов.

Таким образом, я нашел некоторый пример через интернированного и получить ошибку.Может ли кто-нибудь посмотреть на мой образец и сказать, что я делаю не так?

Подготовительные шаги:

Я создал проект в моей личной учетной записи Google.В консоли разработчика проекта в разделе APIS & AUTH -> Credentials я создал служебную учетную запись. Затем нажмите «Создать ключ P12» и загрузите файл .p12.Под APIS & AUTH -> API, включен «Календарь API»

Затем создал консольное приложение и сумел установить пакеты с OAuth и Calendar. Есть:

Клиентская библиотека аутентификации API Google, Google.Apis.Auth 1.8.1Клиентская библиотека API Google, Google.Apis 1.8.1Базовая клиентская библиотека API Google, Id: Google.Apis.Core 1.8.1Google.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 = "506310960175-q2k8hjl141bml57ikufinsh6n8qiu93b@developer.gserviceaccount.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:

Запрос :

Хост: HTTPS account.google.com, URL: / o / oauth2 / token
Утверждение: длинная двоичная строка
тип_транспорта: urn: ietf: параметры: oauth: тип-гранта: jwt-носитель

Отклик:

HTTP / 1.1 400 Bad Request Content-Type: application / json Cache-Control: без кеша, без хранилища, max-age = 0, обязательно повторная проверка 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 Alternate-Protocol: 443: quic Transfer-Encoding: chunked

1f {"error": "invalid_grant"} 0

Пожалуйста, помогите и спасибо заранее!

Ответы на вопрос(3)

Ваш ответ на вопрос