由于授权无效,无法使用服务帐户中的GMail Api

时间:2015-03-12 07:13:21

标签: c# .net google-api gmail-api google-api-dotnet-client

我正在尝试使用.NET服务应用程序中的API来阅读GMail消息。因此,我使用的是“Service Account”(不要求用户以交互方式确认访问权限,并且旨在以服务到服务的方式使用)。

所以,我有以下代码......

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

using Google.Apis.Gmail.v1;
using Google.Apis.Gmail.v1.Data;

namespace Test
{
  public class MyClient
  {
    public List<Message> GetMyMessages()
    {
        var serviceAccountId = "MyServiceAccountId.apps.googleusercontent.com";
        var serviceEMailAddress = "MyServiceEMailAddress@developer.gserviceaccount.com";    // Not required?
        var certificatePwd = "thesecret";
        var userEMailAccount = "user@gmail.com";

        var certFile = File.ReadAllBytes("MyCert.p12");

        var cert = new X509Certificate2(certFile, certificatePwd, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
        var scopes = new string[] { GmailService.Scope.MailGoogleCom };  // Also tried with: GmailService.Scope.GmailCompose and GmailService.Scope.GmailModify

        var currentCredential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountId)
        {
            User = userEMailAccount,
            Scopes = scopes
        }.FromCertificate(cert));

        var service = new GmailService(new Google.Apis.Services.BaseClientService.Initializer
        {
            ApplicationName = "MyApp",
            HttpClientInitializer = currentCredential
        });

        var Messages = new List<Message>();
        var request = service.Users.Messages.List(userEMailAccount);
        request.MaxResults = 3;
        // request.Q = "";

        do
        {
            try
            {
                var response = request.Execute();
                Messages.AddRange(response.Messages);
                request.PageToken = response.NextPageToken;
            }
            catch (Exception e)
            {
                // throws exception with message: Error:"invalid_grant", Description:"", Uri:""
                Console.WriteLine("An error occurred: " + e.Message);
            }
        } while (!string.IsNullOrEmpty(request.PageToken));

        return Messages;
     }
   }
}

在调用request.Execute()方法之前一直正常工作,该方法在下一个异常时失败:错误:“invalid_grant”,描述:“”,Uri:“”

那么,我错过了什么?怎么了?

1 个答案:

答案 0 :(得分:0)

Official documentation说:

  

您的客户端应用程序使用a签署访问令牌请求   从Google Developers Console下载的私钥。后   创建新的客户端ID,您应该选择“服务帐户”   应用程序类型,然后您可以下载私钥。拿一个   看看我们的service account sample using Google Plus API

因此,我所看到的错误可能是由应用程序中的错误密钥引起的。可能是你没有更新它或什么。

不要忘记将构建操作更改为Content,将复制到输出目录更改为Copy if newer,以获取从Google API网站下载的密钥。