使用OAuth2.0访问Google日历时出错。和服务帐户:“模拟假冒电子邮件地址无效。”

时间:2018-07-09 09:01:42

标签: google-api google-calendar-api

我正在尝试使用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某处的设置中。我会错过一步吗?

1 个答案:

答案 0 :(得分:0)

在Google支持人员的帮助下,我解决了该问题。

1:使用服务帐户用户的位置
    string GoogleUser = "MyServiceAccount";
我应该使用模拟用户
    string GoogleUser = "MyAdminUser";

2:当我在管理控制台上添加范围时,我通过使用“服务帐户”电子邮件将其添加了,然后将其可视化地转换为我项目的ClientID,一切似乎都正常。但事实并非如此。当我改用ClientID时,一切正常。