Gmail API返回403禁止,没有其他消息(其他API'正常工作)

时间:2014-10-27 19:56:34

标签: .net google-oauth google-api-dotnet-client gmail-api

我已经获得了几个成功的Google API集成的应用程序。我试图将Gmail集成添加到组合中。我正在使用.NET API,Google.Apis.Gmail.v1(版本1.9.0.140)。

我的代码显示了一个成功的Drive API调用,然后是失败的Gmail API调用:

var drive = new DriveService(Context.GoogleOAuthInitializer);
var list = drive.Files.List().Execute();
Console.WriteLine(list.Items.Count);
// Output: 100 (first page of results)

var gmail = new GmailService(Context.GoogleOAuthInitializer);
var result = gmail.Users.Drafts.List("me").Execute();
// Throws exception described below

.NET异常提供了以下信息:

Google.Apis.Requests.RequestError
Forbidden [403]
Errors [
    Message[Forbidden] Location[ - ] Reason[forbidden] Domain[global]
]

我使用以下范围来获取OAuth令牌。当我添加gmail范围时,我(按预期)再次被Google提示,"您是否希望此应用程序可以访问您的电子邮件?"我还在Google API控制台中启用了gmail API。

https://www.google.com/m8/feeds
https://www.googleapis.com/auth/drive
https://www.googleapis.com/auth/cloudprint
https://www.googleapis.com/auth/userinfo.email
https://mail.google.com/
    * https://www.googleapis.com/auth/gmail.compose was tried as well

真的希望在消息中有更多帮助指出我正确的方向!!!

2 个答案:

答案 0 :(得分:2)

我已经推出了自己的OAuth实现,并且我已经使用此代码添加了授权标头:

void IConfigurableHttpClientInitializer.Initialize(ConfigurableHttpClient httpClient) {
    string auth = string.Format("AuthSub token=\"{0}\"", GoogleOAuthToken);
    httpClient.DefaultRequestHeaders.Add("Authorization", auth);
}

这适用于云端硬盘,云端打印和通讯录API,但出于某种原因,Gmail API需要这样做:

void IConfigurableHttpClientInitializer.Initialize(ConfigurableHttpClient httpClient) {
    string auth = string.Format("Bearer {0}", GoogleOAuthToken);
    httpClient.DefaultRequestHeaders.Add("Authorization", auth);
}

我猜是有道理的,虽然我不知道为什么API会有不同的行为。

修改:不推荐使用AuthSub用于Google API:https://developers.google.com/accounts/docs/AuthSub

答案 1 :(得分:0)

Gmail API比那些更新,并且不接受其他Google API可能使用的旧身份验证格式 - 它只接受oauth2。我不会推出自己的身份验证,在.net中应该有合理的库。