我正在尝试使用OAuth2.0和服务帐户使用Google Calendar API访问组织日历中各种用户的日历,但出现错误
“ invalid_request”“无效的假冒伪装电子邮件地址。”。
在Google控制台中,我有:
-创建了一个项目
-创建一个服务帐户并启用“域范围委托”,并授予“项目所有者”角色,然后获得P12密钥。
-在“安全性”>“高级设置”>“身份验证”>“管理API客户端访问”中,我已授予服务帐户访问权https://www.googleapis.com/auth/calendar.readonly。
using System;
using System.Windows.Forms;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Calendar.v3;
using Google.Apis.Services;
using System.Security.Cryptography.X509Certificates;
namespace Google_Calendar
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
string GoogleCertificate = @"testcalendar-209521-772939e76cae.p12"; // keyfile filename
string GoogleEmail = @"myserviceaccount@testcalendar-209521.iam.gserviceaccount.com"; // serviceaccount mail
string GoogleUser = "MyServiceAccount"; // serviceaccount name
string[] Scopes = new string[] { "https://www.googleapis.com/auth/calendar.readonly" };
X509Certificate2 certificate = new X509Certificate2(GoogleCertificate, "notasecret", X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(GoogleEmail)
{
Scopes = Scopes,
User = GoogleUser
}.FromCertificate(certificate));
CalendarService service = new CalendarService(new BaseClientService.Initializer() { HttpClientInitializer = credential, ApplicationName = "testcalendar" });
string CalenderID = "mathias@mydomain.com";
var CalRequest = service.Events.List(CalenderID);
CalRequest.TimeMin = DateTime.Now.AddMonths(-1); //optional parameter
CalRequest.TimeMax = DateTime.Now.AddMonths(+1); //optional parameter
do
{
var events = CalRequest.Execute(); // here I get the error
foreach (var item in events.Items)
{
// do stuff
}
CalRequest.PageToken = events.NextPageToken;
} while (CalRequest.PageToken != null);
}
}
}
任何想法可能是什么问题?我认为问题出在我在Google某处的设置中。我会错过一步吗?
答案 0 :(得分:0)
在Google支持人员的帮助下,我解决了该问题。
1:使用服务帐户用户的位置
string GoogleUser = "MyServiceAccount";
我应该使用模拟用户
string GoogleUser = "MyAdminUser";
2:当我在管理控制台上添加范围时,我通过使用“服务帐户”电子邮件将其添加了,然后将其可视化地转换为我项目的ClientID,一切似乎都正常。但事实并非如此。当我改用ClientID时,一切正常。