ASP.Net中的Google Apis v3 - “请求中未经授权的客户端或范围”

时间:2014-12-04 15:14:27

标签: c# asp.net google-api google-calendar-api

也许我根本没有得到"它","它"是实现这项工作所需的整体设置。

我有一个网站,用于搜索体育赛事的其他网站。我想从结果中自动创建Google日历活动,因此我想在我的GMail帐户中的日历上提供我的Web应用程序读/写访问权限。

我一直试图将这个问题包围了一个星期,但是我无法让它发挥作用,它正在打击我作为开发人员的自尊心。

我理解的方式"我需要一个Google API v3服务帐户,因为我不需要特定用户的API密钥。或者我需要一个简单的API密钥(而不是oAuth)?

无论如何,我选择了服务帐户。

在我的HomeController中,我试图获取一个日历,所以我知道它一切正常。

    public void Calendar()
    {
        string serviceAccountEmail = "...@developer.gserviceaccount.com";
        var certificate = new X509Certificate2(
            Server.MapPath("~") + @"\App_Data\key.p12",
            "notasecret",
            X509KeyStorageFlags.Exportable);

        ServiceAccountCredential credential =
            new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(serviceAccountEmail)
                    {
                        Scopes = new[]
                                {
                                    CalendarService.Scope.Calendar
                                },
                        User = "MY-GMAIL-EMAIL" // Is this correct?
                    }
                    .FromCertificate(certificate));

        BaseClientService.Initializer initializer = new BaseClientService.Initializer();
        initializer.HttpClientInitializer = credential;
        initializer.ApplicationName = "CALENDAR NAME"; // Correct?

        var service = new CalendarService(initializer);
        var list = service.CalendarList.List().Execute().Items; // Exception :-(
    }

我得到的错误:

An exception of type 'Google.Apis.Auth.OAuth2.Responses.TokenResponseException' occurred in Google.Apis.dll but was not handled in user code

Additional information: Error:"unauthorized_client", Description:"Unauthorized client or scope in request.", Uri:""

所以我在谷歌日历中尝试了很多东西,比如将其公开,将服务帐户电子邮件添加为READ / WRITE用户。

我需要做什么来授权我的Web应用程序,以便它可以代表我创建活动?

1 个答案:

答案 0 :(得分:0)

我在类似的帖子中使用服务帐户完成了此操作。我改变了一些我的代码,并通过切换一些东西让它列出我的日历。我也可以创建活动。我没有像在初始化程序中那样添加用户,在应用程序名称下,它是开发控制台中应用程序的名称。确保为应用程序命名。确保您的帐户共享您的服务帐户。

我稍微将代码的列表部分更改为我的,并取回了我的日历列表。

var list = service.CalendarList.List();
var listex = list.Execute();

Google API Calender v3 Event Insert via Service Account using Asp.Net MVC

上查看我的示例