Google Calendar V3 2 Legged身份validation失败

我正在尝试创建访问公司(业务)私人日历的网页,并在时隙可用时插入事件。 我仍面临身份validation问题。

API手册指出我应该使用API​​密钥和Oauth2LeggedAuthenticator,所以我做了所有这些并且被触发的请求非常好(它有一个oauth令牌等)但是响应是一个带有无效凭据的exception; 很容易说我的凭据是错误的,仍然是clientID,clientSecret和API Key是有效的; 我怀疑2leged认证者的最后两个参数,这是正确的吗?

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进行双方式身份validation,这对个人帐户无效,因为无法获取OAuth 1.0密钥/密钥对,您必须使用在线身份validation至少一次(但您可以使用浏览器外选项,这样您就不必创建专用页面)。

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

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

要设置OAuth,请按照Google 撰写本文中的说明进行操作。

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

如果您以前依赖“允许访问所有API”来使用各种服务,这将导致您出现问题,您必须根据我的理解单独授予它们以使用v3 API。 这似乎已经得到谷歌的确认 (Nicolas Garnier的第4次回复)并且据说是一个错误,但这是一个旧post,所以它看起来好像在这里留下来。

作为参考,一旦完成,这段代码将起作用,本质上与你的相同:

 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域密钥”启用密钥,生成密钥,取消选中“允许访问所有API”。

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

然后最后在API控制台中创建一个项目,在上面的示例中使用API​​Key作为serviceKey,并打开您需要访问的API。

当我试图找出为什么我的代码不断返回401s时,我一直在回答这个问题。 希望这可以帮助某人,因为谷歌的指令现在非常糟糕,分散在各处。