我正在尝试使用.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:“”
那么,我错过了什么?怎么了?
答案 0 :(得分:0)
您的客户端应用程序使用a签署访问令牌请求 从Google Developers Console下载的私钥。后 创建新的客户端ID,您应该选择“服务帐户” 应用程序类型,然后您可以下载私钥。拿一个 看看我们的service account sample using Google Plus API。
因此,我所看到的错误可能是由应用程序中的错误密钥引起的。可能是你没有更新它或什么。
不要忘记将构建操作更改为Content
,将复制到输出目录更改为Copy if newer
,以获取从Google API网站下载的密钥。