Google Calendar V3 2 Legged身份验证失败

时间:2012-01-17 17:28:02

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

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

API manual states我应该使用API​​密钥和Oauth2LeggedAuthenticator,所以我做了所有这些并且被触发的请求非常好(它有一个oauth令牌等等)但是响应是一个例外凭据无效;很容易说我的凭据是错误的,仍然是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);

1 个答案:

答案 0 :(得分:4)

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

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

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

要设置OAuth,请按照Google的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域密钥”启用密钥,生成密钥,取消选中“允许访问所有API”。

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

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

当我试图找出为什么我的代码不断返回401时,我一直在回答这个问题。希望这有助于某人,因为谷歌的指令很可怕,而且现在遍布整个地方。