如何从应用程序访问日历而不需要询问电子邮件帐户和密码?

How to access calendars from an application without needed to ask for email account and password?

我想开发一个应用程序来访问 google 帐户中的一些日历。

我的想法是只设置 google 帐户,myaccount@gmail.com 应用程序就可以连接。唯一的要求是转到 google 帐户并授予对我的应用程序的访问权限。这样我可以为很多用户安装应用程序,他们不需要做任何事情。

这就是插件 caldav synchronizer 的工作方式。

为此,我在 google 帐户中创建了一个服务帐户,并使用此代码尝试创建日历服务:

public CalendarService GetCalendarServiceServiceAccount(string paramStrPathCertificado, string paramStrEmailServiceAccount, string[] paramScopes)
{
    var certificate = new X509Certificate2(paramStrPathCertificado, "notasecret", X509KeyStorageFlags.Exportable);

    ServiceAccountCredential credential = new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(paramStrEmailServiceAccount)
            {
                Scopes = paramScopes,
            }.FromCertificate(certificate));


    CalendarService micalendarService = new CalendarService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = "My Calendars"
        });

        return micalendarService;
}

然后我使用此代码获取日历:

var dummyService = GetCalendarServiceServiceAccount("credentials2.p12", "myCalendars@XXX.gserviceaccount.com", ScopesParaModificar);
IEnumerable<CalendarListEntry> dummyCalendarios = dummyService.CalendarList.List().Execute().Items;

范围:

static string[] ScopesParaModificar = { CalendarService.Scope.Calendar, CalendarService.Scope.CalendarEvents };

问题是我没有日历。

,答案说在我的google帐户中,我应该将服务帐户的用户添加到我的日历中,但它不起作用,我无法获取日历.此外,此解决方案并不是我真正想要的,因为我不想将此服务帐户添加到我的日历中。在 caldav 同步器中,我不需要添加我的日历的任何用户,只需将我的 google 具有日历的帐户设置为用户,然后允许该应用程序作为受信任的应用程序。

那么我如何访问我的日历只说明我的 google 帐户并授予应用程序权限?

谢谢。

与服务帐户共享

为了让服务帐户访问日历。日历的所有者通常是应用程序的开发者。将获取服务帐户电子邮件地址并与服务帐户共享日历。这是通过 Web ui 与任何其他用户一样完成的。

与服务帐户共享日历后,它将能够访问它。

什么是日历列表。

CalendarList.List 用于请求用户已添加到其 CalendarList 的日历列表。日历列表只是 google 日历 Web 应用程序中的一个 UI 元素。它出现在 Google 日历网站 UI

的左下角

在 Google 日历 Web 应用程序中,当您创建新日历时,它会自动添加到用户日历列表中。如果日历与您共享,它通常也会添加到那里。 (我发现这是有问题的)

但是,如果您与服务帐户共享日历,因为它没有 UI 元素,它们不会自动添加。这就是为什么服务帐户 calendarlist.list returns 为空。

如果您想将日历添加到服务帐户日历列表中,则需要执行 calendarlist.insert 并手动添加。

你应该做什么。

I want to develop an application to access some caledars in a google account.

谁拥有您要访问的日历。如果是您,那么您应该使用服务帐户。

如果日历归其他用户所有,那么您将需要使用 Oauth2 并授权用户访问他们的数据,您不应在此用例中使用服务帐户。使用 Oauth2 让您的用户授权您的应用程序存储刷新令牌,然后在将来使用刷新令牌访问他们的日历。