【问题标题】:Google Calendar V3 2 Legged authentication failsGoogle Calendar V3 2 Legged 身份验证失败
【发布时间】:2015-02-25 16:17:36
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

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

导致 401 的另一件事是使用“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 时,我一直在问这个问题。希望这对某人有所帮助,因为 Google 的说明目前很糟糕而且分散在各处。

【讨论】:

  • 在本例中,“consumerSecret”是否与 Google API 控制台 (code.google.com/apis/console) 上显示的“客户端密码”相同?另外,“serviceKey”是否与控制台中的 Simple API Access API Key 相同?
  • @Rob Gibbens 不,它们只能用于 3 腿。
  • 博客文章的链接已失效...对我来说,2LO 无法使用 OAuth 2.0,这就是客户端库使用的...您能否确认此方法仍然有效?
  • @billy,更新了博客帖子的位置,据我记忆,看起来像同一篇文章,但解释少了一点。据我所知,这一切仍然有效,我有几个应用程序使用这种方法。
  • 您使用什么 OAuth dll? Google.Apis.Authentication.OAuth2.dll ?
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2013-08-21
相关资源
最近更新 更多