Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 谷歌日历API。将事件添加到某人日历会引发错误“;错误401:无效的“U客户端”;就在认证的时候_C#_Visual Studio 2013_Oauth 2.0_Google Calendar Api_Google Oauth - Fatal编程技术网

C# 谷歌日历API。将事件添加到某人日历会引发错误“;错误401:无效的“U客户端”;就在认证的时候

C# 谷歌日历API。将事件添加到某人日历会引发错误“;错误401:无效的“U客户端”;就在认证的时候,c#,visual-studio-2013,oauth-2.0,google-calendar-api,google-oauth,C#,Visual Studio 2013,Oauth 2.0,Google Calendar Api,Google Oauth,我有一个C#类库,我试图通过使用某人的电子邮件地址和密码作为凭据,将事件添加到某人的日历中。因此,我调试了它,一旦启动,internet浏览器中的一个新页面将打开,并显示以下错误: 代码如下: // It crashes when calling GoogleWebAuthorizationBroker.AuthorizeAsync UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(

我有一个C#类库,我试图通过使用某人的电子邮件地址和密码作为凭据,将事件添加到某人的日历中。因此,我调试了它,一旦启动,internet浏览器中的一个新页面将打开,并显示以下错误:

代码如下:

// It crashes when calling GoogleWebAuthorizationBroker.AuthorizeAsync
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                new ClientSecrets
                {
                    ClientId = "myGoogleAccount@gmail.com",
                    ClientSecret = "myGoogleAccountPasswordHere",
                },
                new[] { CalendarService.Scope.Calendar },
                System.Environment.UserName,
                CancellationToken.None).Result;

   // Create the service.
   var service = new CalendarService(new BaseClientService.Initializer()
   {
                HttpClientInitializer = credential,
                ApplicationName = "Calendar API Sample",
   });
为什么会发生这种错误?ClientId不是gmail帐户吗? 还有,为什么会在internet浏览器中打开新页面?我想在不打开internet浏览器页面的情况下进行身份验证,因为此类库是从windows服务调用的,因此我需要在后台进行身份验证。

回答: 为了将方法插入到用户的日历中,您需要用户为您的应用程序授予代表其执行操作的权限。这是使用一个带有OAuth2身份验证的Google云平台(GCP)项目完成的

更多信息: 每个代表Google帐户用户运行和执行操作的应用程序都必须定义好其功能范围,以便它不能开始执行用户未授予其权限的操作

例如:如果您授予应用程序创建日历事件的权限,则不希望它能够执行其他操作,例如读取电子邮件或下载驱动器内容

为了指定你的应用程序有权做什么,它需要在谷歌注册。正如您在问题和评论中已经推断的那样,连接到G套件API的应用程序所需的客户端ID和客户端机密不仅仅是Google帐户的用户名和密码,而是Google提供的用于识别您的应用程序的指定ID-Secret-ID对

OAuth2: OAuth2是一个特定的授权框架。该框架在中定义,并规定了用户授权应用程序访问其帐户的过程。授权的限制由授权的应用范围定义,未经用户明确的重新授权,不得更改

在继续之前,有必要在此定义几个重要术语:

用户:

用户就是人;拥有帐户并允许应用程序代表其采取行动的个人

客户端或应用程序:

客户机或应用程序是一个程序,旨在通过连接到服务的API通过HTTP执行操作。应用程序可以是移动应用程序、web应用程序或桌面客户端

授权服务器:

授权服务器是与存储用户资源的服务器分开的服务器。它验证用户的身份,并提供可用于获取资源服务器访问令牌的授权

资源服务器:

这是存储用户数据的服务器。这可能是从用户信息到文件或电子邮件的任何内容

授权流程已经有了很好的文档记录,但出于这种情况,我们可以将其抽象为以下步骤:

  • 应用程序希望代表用户在资源服务器上执行操作
  • 应用程序向用户发出授权请求。这通常显示为应用程序正在访问的帐户的登录页面
  • 用户登录到他们的帐户,并显示一个OAuth同意屏幕-其中包含应用程序名称等信息,以及它请求授权的任务列表。这些通常是通用的,比如说
    查看并下载所有谷歌硬盘文件
    ,或者
    查看并编辑所有日历上的事件
    。这允许用户在确认之前知道他们正在授权什么
  • 申请将获得授权
  • 应用程序将获得的授权授权与其分配的客户端凭据一起提供给授权服务器
  • 验证用户的授权和客户端的凭据是否正确后,授权服务器将返回一个访问令牌,该令牌可用于访问请求的和批准的资源。注意:对于您使用的任何语言,这通常都由您的客户端库处理
  • 应用程序现在可以向资源服务器发出请求,提供从授权流获得的访问令牌。正是在这一点上,可以访问允许的资源
谷歌云平台项目: 谷歌视为你的应用程序的GCP项目。您的应用程序注册需要能够获取您的应用程序在授权流中获取访问令牌所需的客户端ID和客户端机密。 在中,您可以设置应用程序所需的所有必需服务。您希望使用的每个API都必须为您的应用程序启用,因为它们在默认情况下是禁用的

创建GCP项目后,您可以使用API库(从
≡ > API&Services>Library(左侧的
菜单项)查找并启用API。注意,对于您的用例,您需要启用Google日历API,而不是CalDAV API

在获取应用程序的凭据之前,您还需要设置同意屏幕。OAuth同意屏幕是在OAuth流程的第一步中向用户显示的内容:

设置OAuth同意屏幕时,需要提供以下信息:

  • 应用程序类型(域的公共或内部)
  • 应用程序名称
  • 应用程序需要的范围(在下一节中解释)
设置同意屏幕后,您可以下载应用程序的客户端凭据 // scopes are defined as an array of strings: static string[] Scopes = { CalendarService.Scope.CalendarReadonly }; ... UserCredential credential; credential = GoogleWebAuthorizationBroker.AuthorizeAsync( GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result;