c# - Google Calendar V3 2 腿认证失败

标签 c# oauth google-api google-calendar-api

我正在尝试创建访问公司(业务)私有(private)日历的网页,并在时间段可用时插入事件。我仍然面临身份验证问题。

API manual states我应该使用 API key 和 Oauth2LeggedAuthenticator,所以我做了所有这些并且被触发的请求非常好(它有一个 oauth token 等)但是响应仍然是 Invalid Credentials 的异常;容易说的是我的凭据错误,但 clientID、clientSecret 和 API Key 仍然有效;我怀疑 2legged 验证器的最后 2 个参数是否正确?

var provider = new NativeApplicationClient(GoogleAuthenticationServer.Description);
provider.ClientIdentifier = ClientCredentials.ClientID;
provider.ClientSecret = ClientCredentials.ClientSecret;

var authenticator =
new OAuth2LeggedAuthenticator(ClientCredentials.ClientID, ClientCredentials.ClientSecret, "myworkusername", "workdomain.com");


Google.Apis.Calendar.v3.CalendarService service = new Google.Apis.Calendar.v3.CalendarService(authenticator);

service.Key = ClientCredentials.ApiKey;


var result = service.CalendarList.List().Fetch();

Assert.IsTrue(result.Items.Count > 0);

最佳答案

注意:在撰写本文时,您只能使用 Google Apps for Business/Eduction 的双向身份验证,这不适用于个人帐户,因为无法获得 OAuth 1.0 key / secret 对,您将必须至少使用一次在线身份验证(但您可以使用浏览器外选项,这样您就不必创建专用页面)。

除了您不需要与 NativeApplicationClient 相关的前三行之外,您的代码是正确的。这很可能会失败,因为您没有正确设置 OAuth key ,这会导致 401。

导致 401 的另一件事是使用“matt@example.com”而不是“matt”作为用户名,用户名不包括您的域。

要设置 OAuth,请按照 this article 中的说明进行操作来自谷歌。

需要注意的最重要的部分是“允许访问所有 API”必须未选中并且您必须单独授予对所有 API 的访问权限。如果尚未完成此操作,您将收到 401 Invalid Credentials 错误。然后您还需要在 api console 中打开这些服务.如果 api 控制台步骤尚未完成,您将收到一个不同的错误,即 403 Daily Limit Exceeded

如果您以前依赖“允许访问所有 API”来使用各种服务,这会给您带来问题,据我所知,您必须单独授予它们才能使用 v3 API。这好像have been confirmed by google (Nicolas Garnier 的第 4 次回复)并且应该是一个错误,但那是一篇旧帖子,所以它看起来好像会保留下来。

作为引用,一旦完成此操作,此代码将起作用,本质上与您的代码相同:

var auth = new OAuth2LeggedAuthenticator(domainName, consumerSecret, usernameWithoutDomain, domainName);  //domainName is presently used as the OAuth ConsumerKey for Google's 2legged OAuth

var service = new CalendarService(auth);

service.Key = serviceKey;

var results = service.CalendarList.List().Fetch();

Console.WriteLine(results.Items.Count);

总结一下:

在 Google Apps“管理此域”>“高级工具”中

使用“管理 OAuth 域 key ”启用 key ,生成 key ,取消选中“允许访问所有 API”。

使用“管理第三方 OAuth 客户端访问”启用您想要访问的 API,使用您的域作为“客户端名称”和您想要访问的 API,例如“http://www.google.com/calendar/feeds/”用于日历。

然后最后在API console中创建一个项目,使用API​​Key作为上例中的serviceKey,并开启你需要访问的API。

我正在回答这个问题,因为我在试图找出为什么我的代码不断返回 401 时一直在问这个问题。希望这对某人有所帮助,因为目前 Google 的说明很糟糕并且散落在各处。

关于c# - Google Calendar V3 2 腿认证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8899000/

相关文章:

google-apps-script - 改为24小时。 DateRangeFilter 的模式

android - 无法使用 Google drive api android 从 google drive 查询文件 "shared with me"

c# - 在 gridview 中使用 PAGING 为 FILTER 实现正确逻辑的方法

c# - 发出连续的蜂鸣声,直到在 c# 中被打断

windows-phone-7 - 获取 dropbox access_token 适用于 Windows 但不适用于 Windows Phone

java - Resteasy/Spring Security + Oauth 2.0 - 错误 404

objective-c - 将现有 OAuth 凭据迁移到 ACAccountStore 时出错

c# - 创建帐户状态为 "CONFIRMED"且没有电子邮件地址的 AWS Cognito 用户

c# - 将对象转换为 List<object>

c# - 获得访问 token 后调用 Google API 来获取个人资料数据