Google Calendar V3 2 Legged аутентификация не проходит - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь создать веб-страницу для доступа к (служебному) частному календарю компании и вставлять события, если временной интервал доступен. Тем не менее я сталкиваюсь с проблемой аутентификации.

В руководстве API указано , что я должен использовать ключ API и Oauth2LeggedAuthenticator, поэтому я сделал все это, и запрос, который сгенерирован, довольно странный (он имеет токен oauth и тому подобное), но ответ все равно исключение: неверные учетные данные ; Легко сказать, что мои учетные данные неверны, но все равно допустимы clientID, clientSecret и API Key; Я сомневаюсь в 2 последних параметрах аутентификатора 2legged, это правильно?

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 Ответ

4 голосов
/ 08 февраля 2012

Примечание: на момент написания вы могли использовать только двухстороннюю аутентификацию с Google Apps для бизнеса / Eduction, это не будет работать в личных аккаунтах, так как нет способа получить пару ключ / секрет OAuth 1.0, вы будетенеобходимо использовать онлайн-аутентификацию хотя бы один раз (но вы можете использовать опцию вне браузера, чтобы вам не пришлось создавать выделенную страницу).

Ваш код верен, если вам не нужнопервые три строки, относящиеся к NativeApplicationClient.Скорее всего, это сбой, потому что вы не правильно установили ключи OAuth, это вызывает 401 с.

Другая причина, которая вызывает 401 с, - использовать «matt@example.com» вместо «matt» в качестве имени пользователя,имя пользователя не включает ваш домен.

Чтобы настроить OAuth, следуйте инструкциям, приведенным в этой статье от Google.

Важнейшие части, на которые следует обратить внимание: «Разрешить доступ ко всемAPIs "должен быть не отмечен , и вы должны индивидуально предоставить доступ ко всем API.Если это не было сделано, вы получите ошибку 401 Invalid Credentials.Затем вам также необходимо включить эти службы в консоли api .Если шаг консоли API не был выполнен, вы получите другую ошибку 403 Daily Limit Exceeded.

Это вызовет проблемы, если вы ранее полагались на «Разрешить доступ ко всем API» для использования различных сервисов.вам придется предоставить их все по отдельности, насколько я понимаю, для использования API v3.Кажется, это было подтверждено google (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 "Управление этим доменом"> "Расширенные инструменты "

Используя ключ управления" Управлять ключом домена OAuth ", генерируйте секрет, снимите флажок" Разрешить доступ ко всем API ".

Используя" Управление доступом клиента OAuth стороннего производителя ", включите API, которые выхотите получить доступ к использованию своего домена в качестве «имени клиента» и API, к которым вы хотите получить доступ, например, «http://www.google.com/calendar/feeds/" для календаря».

Затем, наконец, создайте проект в консоли API , используйтеAPIKey в качестве serviceKey в вышеприведенном примере и включите API, к которым вам нужен доступ.

Я отвечаю на этот вопрос, так как продолжал задавать этот вопрос, когда пытался выяснить, почему мой код постоянно возвращал 401.Надеюсь этокому-то помогает, так как инструкции Google ужасны и разбросаны повсюду.

...