gpt4 book ai didi

oauth - Google API OAuth2,服务帐户, "error": "invalid_grant"

转载 作者:行者123 更新时间:2023-12-04 01:08:21 25 4
gpt4 key购买 nike

我正在尝试使用服务帐户将日历从 Dynamics CRM 软件同步到 Google。
在此期间,我面临缺乏关于 .net 的 google API 的文档,尤其是关于授权的文档。由于使用了过时的库和类,大多数 Google 示例甚至无法编译。

所以我在实习生中找到了一些例子并收到错误。 有人可以看看我的样本并告诉我我做错了什么吗?

准备步骤:

  • 我在我的私有(private) Google 帐户中创建了一个项目。
  • 在项目开发者控制台中,在 APIS & AUTH -> Credentials 下,我生成了服务帐户。然后单击“生成 P12 key ”并下载 .p12 文件。
  • 在 APIS & AUTH -> APIs 下,打开“日历 API”

  • 然后创建控制台应用程序并设法安装 OAuth 和日历 nuget 包。有:
  • Google API 身份验证客户端库,Google.Apis.Auth 1.8.1
  • Google API 客户端库,Google.Apis 1.8.1
  • Google API 核心客户端库,ID:Google.Apis.Core 1.8.1
  • Google.APIs.Calendar.v3 客户端库,Google.Apis.Calendar.V3 1.8.1.860

  • 找到并适应了我的需要的代码:

    using System;
    using System.Security.Cryptography.X509Certificates;
    using Google.Apis.Calendar.v3;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Services;

    namespace CrmToGoogleCalendar
    {
    class Program
    {

    static void Connect()
    {
    var certificate = new X509Certificate2("My Project-ee7facaa2bb1.p12", "notasecret", X509KeyStorageFlags.Exportable);


    var serviceAccountEmail = "506310960175-q2k8hjl141bml57ikufinsh6n8qiu93b@developer.gserviceaccount.com";
    var userAccountEmail = "<my email>@gmail.com";
    var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
    {
    User = userAccountEmail,
    Scopes = new[] { CalendarService.Scope.Calendar }
    }
    .FromCertificate(certificate));

    var service = new CalendarService(new BaseClientService.Initializer()
    {
    ApplicationName = "Test calendar sync app",
    HttpClientInitializer = credential

    });

    var calList = service.CalendarList.List().Execute().Items;


    foreach (var cal in calList)
    {
    Console.WriteLine(cal.Id);
    }
    }


    static void Main(string[] args)
    {
    Connect();
    }
    }
    }

    我在应用程序和 Fiddler 中看到的与 Google API 的通信是:

    要求 :

    Host: HTTPS accounts.google.com, URL: /o/oauth2/token
    Assertion: long binary string
    grant_type: urn:ietf:params:oauth:grant-type:jwt-bearer



    回复:

    HTTP/1.1 400 Bad Request Content-Type: application/json Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: Fri, 01 Jan 1990 00:00:00 GMT Date: Thu, 24 Jul 2014 06:12:18 GMT X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block Server: GSE Alternate-Protocol: 443:quic Transfer-Encoding: chunked

    1f { "error" : "invalid_grant" } 0



    Fiddler screenshot

    请提前帮助和感谢!

    最佳答案

    经过一些调查,我发现 Google API 无法与您的个人帐户 @gmail.com 正常工作。您应该在 Google 中拥有格式为 you@your_organisation_domain 的组织域帐户

    然后,同样令人困惑的是,Google Drive API page 上有文档。 , 与 “将域范围的权限委派给您的服务帐户”日历 API 页面上未提及的部分。
    该部分有 7 个步骤,必须完成。

    顺便说一句,个人帐户管理网站 admin.google.com 甚至不可用。因此,使用@gmail.com 帐户执行这 7 个步骤是不可能的。

    然后,当客户端在 Google Apps 管理控制台 > 安全 > 高级设置 > 管理 OAuth 客户端访问中获得授权时,代码开始工作。

    有一个代码对我有用:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Security.Cryptography.X509Certificates;
    using Google.Apis.Calendar.v3;
    using Google.Apis.Calendar.v3.Data;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Services;

    namespace CrmToGoogleCalendar
    {
    class Program
    {

    static void Connect()
    {
    Console.WriteLine("Calendar via OAuth2 Service Account Sample");

    var certificate = new X509Certificate2("My MC Project-3f38defdf4e4.p12", "notasecret", X509KeyStorageFlags.Exportable);
    var serviceAccountEmail = "795039984093-c6ab1mknpediih2eo9cb70mc9jpu9h03@developer.gserviceaccount.com";
    var userAccountEmail = "me@testdomain.com";
    var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
    {
    User = userAccountEmail,
    Scopes = new[] { CalendarService.Scope.Calendar }
    }
    .FromCertificate(certificate));

    var service = new CalendarService(new BaseClientService.Initializer()
    {
    ApplicationName = "Test calendar sync app",
    HttpClientInitializer = credential

    });

    /* Get list of calendars */
    var calList = service.CalendarList.List().Execute().Items;
    var myCalendar = calList.First(@c => @c.Id == userAccountEmail);

    /* CREATE EVENT */
    var event1 = new Event()
    {
    Kind = "calendar#event",
    Summary = "Calendar event via API",
    Description = "Programmatically created",
    Status = "confirmed",
    Organizer = new Event.OrganizerData() {
    Email = userAccountEmail
    },
    Start = new EventDateTime()
    {
    DateTime = DateTime.Now.AddDays(1)
    },
    End = new EventDateTime()
    {
    DateTime = DateTime.Now.AddDays(1).AddHours(1)
    },
    ColorId = "6",
    Reminders = new Event.RemindersData()
    {
    UseDefault = false,
    Overrides = new List<EventReminder>(
    new [] {
    new EventReminder()
    {
    Method = "popup",
    Minutes = 60
    }
    })
    }
    };

    event1 = service.Events.Insert(event1, myCalendar.Id).Execute();
    Console.WriteLine("Created event Id: {0}", event1.Id);


    /* ENLIST EVENTS */
    Console.WriteLine("calendar id={0}", myCalendar.Id);
    var events = service.Events.List(myCalendar.Id).Execute();
    foreach (var @event in events.Items)
    {
    Console.WriteLine("Event ID: {0}, ICalUID: {1}", @event.Id, @event.ICalUID);
    Console.WriteLine(" Name: {0}", @event.Summary);
    Console.WriteLine(" Description: {0}", @event.Description);
    Console.WriteLine(" Status: {0}", @event.Status);
    Console.WriteLine(" Color: {0}", @event.ColorId);
    Console.WriteLine(" Attendees: {0}", @event.Attendees == null ? "" : @event.Attendees.Select(a => a.Email).ToString());
    Console.WriteLine(" Kind: {0}", @event.Kind);
    Console.WriteLine(" Location: {0}", @event.Location);
    Console.WriteLine(" Organizer: {0}", @event.Organizer.Email);
    Console.WriteLine(" Recurrence: {0}", @event.Recurrence == null ? "no recurrence" : String.Join(",", @event.Recurrence));
    Console.WriteLine(" Start: {0}", @event.Start.DateTime == null ? @event.Start.Date : @event.Start.DateTime.ToString());
    Console.WriteLine(" End: {0}", @event.End.DateTime == null ? @event.End.Date : @event.End.DateTime.ToString());
    Console.WriteLine(" Reminders: {0}", @event.Reminders.UseDefault.Value ? "Default" : "Not defailt, " +
    (@event.Reminders.Overrides == null ? "no overrides" : String.Join(",", @event.Reminders.Overrides.Select(reminder => reminder.Method + ":" + reminder.Minutes)))
    );
    Console.WriteLine("=====================");
    }

    Console.ReadKey();
    }


    static void Main(string[] args)
    {
    Connect();
    }
    }
    }

    产生的输出看起来是这样的:
    Calendar via OAuth2 Service Account Sample
    Created event Id: jkits4dnpq6oflf99mfqf1kdo0
    calendar id=me@testdomain.com
    Event ID: 1logvocs77jierahutgv962sus, ICalUID: 1logvocs77jierahutgv962sus@google.com
    Name: test event
    Description: test description2
    Status: confirmed
    Color:
    Attendees:
    Kind: calendar#event
    Location: location2
    Organizer: me@testdomain.com
    Recurrence: RRULE:FREQ=WEEKLY;BYDAY=TH
    Start: 2014-07-31
    End: 2014-08-01
    Reminders: Not defailt, email:10,popup:10
    =====================
    Event ID: 1logvocs77jierahutgv962sus_20140814, ICalUID: 1logvocs77jierahutgv962sus@google.com
    Name: test event updated
    Description: test description2
    Status: confirmed
    Color:
    Attendees:
    Kind: calendar#event
    Location: location2
    Organizer: me@testdomain.com
    Recurrence: no recurrence
    Start: 2014-08-14
    End: 2014-08-15
    Reminders: Not defailt, email:10
    =====================
    Event ID: 974hqdhh8jhv5sdobkggmdvvd8, ICalUID: 974hqdhh8jhv5sdobkggmdvvd8@google.com
    Name: One hour event
    Description: test description
    Status: confirmed
    Color: 7
    Attendees:
    Kind: calendar#event
    Location: Meeting Room Hire, Broadway, 255 The Bdwy, Broadway, NSW 2007, Australia
    Organizer: me@testdomain.com
    Recurrence: no recurrence
    Start: 1/08/2014 10:00:00 AM
    End: 1/08/2014 11:00:00 AM
    Reminders: Default
    =====================
    Event ID: jkits4dnpq6oflf99mfqf1kdo0, ICalUID: jkits4dnpq6oflf99mfqf1kdo0@google.com
    Name: Calendar event via API
    Description: Programmatically created
    Status: confirmed
    Color: 6
    Attendees:
    Kind: calendar#event
    Location:
    Organizer: me@testdomain.com
    Recurrence: no recurrence
    Start: 2/08/2014 12:30:50 PM
    End: 2/08/2014 1:30:50 PM
    Reminders: Not defailt, popup:60
    =====================

    第一个事件是每周一次的全天事件系列。
    第二个是更新第一个事件的单个事件(具有相同的 UID)。
    第三是一小时的单项事件。
    最后一个是由上面的代码创建的。

    希望这将有助于其他人节省时间。

    关于oauth - Google API OAuth2,服务帐户, "error": "invalid_grant",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24946453/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com