Google Calendar V3 2 Legged身份验证失败

本文关键字:身份验证 失败 Legged Calendar V3 Google | 更新日期: 2023-09-27 18:20:29

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

API手册规定我应该使用API密钥和Oauth2LeggedAuthenticator,所以我做了所有这些,并且被触发的请求很正常(它有oauth令牌等等),但响应仍然是一个异常,无效凭据;很容易说,我的凭据是错误的,仍然clientID,clientSecret和API密钥是有效的;我怀疑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 Calendar V3 2 Legged身份验证失败

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

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

导致401s的另一个原因是使用"matt@example.com"而不是"matt"作为用户名,用户名不包括您的域。

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

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

如果您以前依赖"允许访问所有API"来使用各种服务,这将给您带来问题,据我所知,您必须单独授予它们才能使用v3 API。这似乎已经被谷歌证实了(尼古拉斯·加尼尔的第四次回复),据说是一个bug,但这是一个旧帖子,所以看起来它会一直存在。

作为参考,一旦完成,这个代码将工作,本质上与您的相同:

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);

综上所述:

在谷歌应用程序"管理此域">"高级工具"

使用"管理OAuth域密钥"启用密钥,生成密钥,取消选中"允许访问所有API"。

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

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

当我试图找出为什么我的代码不断返回401时,我一直在回答这个问题。希望这能帮助到一些人,因为谷歌的指令很糟糕,而且现在到处都是。