我正在尝试创建访问公司(业务)私有(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中创建一个项目,使用APIKey作为上例中的serviceKey,并开启你需要访问的API。
我正在回答这个问题,因为我在试图找出为什么我的代码不断返回 401 时一直在问这个问题。希望这对某人有所帮助,因为目前 Google 的说明很糟糕并且散落在各处。
关于c# - Google Calendar V3 2 腿认证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8899000/