如何从应用程序访问日历而不需要询问电子邮件帐户和密码?
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 让您的用户授权您的应用程序存储刷新令牌,然后在将来使用刷新令牌访问他们的日历。
我想开发一个应用程序来访问 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 帐户并授予应用程序权限?
谢谢。
与服务帐户共享
为了让服务帐户访问日历。日历的所有者通常是应用程序的开发者。将获取服务帐户电子邮件地址并与服务帐户共享日历。这是通过 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 让您的用户授权您的应用程序存储刷新令牌,然后在将来使用刷新令牌访问他们的日历。