asp.net中的Google日历Api v3和OAuth2 ServiceAccountCredential

时间:2014-11-21 17:48:47

标签: asp.net oauth-2.0 google-calendar-api

我正在尝试使用服务帐户凭据连接到Googels API。我在Googles开发人员控制台中创建了一个服务帐户我还完成了Google Apps域帐户中的所有设置,但它不起作用。当我尝试在Google日历中获取活动时,我收到以下消息。 Google.Apis.Auth.OAuth2.Responses.TokenResponseException:错误:“access_denied”描述:“请求的客户端未授权”。 Uri:“”

拜托,我做错了什么?

这是我的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using Google.Apis.Services;
using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string serviceAccountEmail = ".....@developer.gserviceaccount.com";
        string keyFilePath = @"c:\nameName.p12";
        string  userEmail = "name.name@domain.com";
        string[] scopes = new string[] { CalendarService.Scope.Calendar, CalendarService.Scope.CalendarReadonly }; 

        var certificate = new X509Certificate2(keyFilePath, "secret", X--------509rageFlags&???.Exportable);
        var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
        {
            User = userEmail,
            Scopes = scopes
        }.FromCertificate(certificate));

        // Create the service.
        var calService = new CalendarService(new BaseClientService.Initializer()
        {
            ApplicationName = "Test calendar",
            HttpClientInitializer = credential,
        });

        string eventid = "_60q30c1g60o0s46chk74oj0dhh64rj8ca16p138dpo74ojedhh8oq34dq4";

        Event myEvent = calService.Events.Get(userEmail, eventid).Execute();
        Literal1.Text = myEvent.Summary;

    }
}

2 个答案:

答案 0 :(得分:0)

如果您的应用访问用户数据,则需要授予您创建的服务帐户访问您要访问的Google Apps域的用户数据的权限。

以下步骤必须由Google Apps域管理员执行:转到Google Apps域的管理控制台。

从控件列表中选择安全性。如果您没有看到列出的安全性,请从页面底部的灰色栏中选择更多控件,然后从控件列表中选择安全性。

从选项列表中选择高级设置。

在“身份验证”部分中选择管理第三方OAuth客户端访问。

在客户名称字段中输入服务帐户的客户ID。

在“一个或多个API范围”字段中,输入应授予应用程序访问权限的范围列表。例如,如果您需要对Google Drive API和Google Calendar API进行全域访问,请输入:https://www.googleapis.com/auth/drivehttps://www.googleapis.com/auth/calendar

点击授权。

另外,请检查您的代码中是否包含了应用程序尝试访问的所有范围。

如果您仍然看到问题,请告诉我。

答案 1 :(得分:0)

我发现了错误。你是SGC的对。我在我的代码中输入了CalendarService.Scope.Calendar和CalendarService.Scope.CalendarReadonly的scops。 但在Google Apps域的管理员控制台中,我刚刚输入了对https://www.googleapis.com/auth/calendar的访问权限。我还必须添加https://www.googleapis.com/auth/calendar.readonly。很明显,这很愚蠢。

感谢SGC