2014-11-19 2 views
3

Мое приложение использует Google API Calendar V3 с OAuth, и это отлично работает. Сначала он попросит пользователя о своем согласии. Для создания, изменения и удаления событий календаря легко использовать службу календаря. Пока все хорошо!Как создать ContactService с помощью API контактов Google v3 с OAuth v2 UserCredentials

Теперь я хочу задать пользователю разрешение на добавление и изменение контактных данных. Добавив следующую строку «https://www.google.com/m8/feeds/», пользователю также предлагается разрешение на доступ к контакту. Это похоже на работу. Однако я не могу найти способ создания ContactService на основе UserCredential, полученного в результате вышеуказанного процесса. Как использовать UserCredential с ContactService?

Я прочитал все вопросы с помощью тегов: Google-контакт и Google-api-dotnet-клиент. Я проверил документацию по API V3, и я нашел создание сервиса для Календаря, Диска и множество других API, но не для контакта? Что я пропущу?

Это фрагмент кода, который я использую, чтобы запросить разрешение и запустить службу календаря.

using Google.Contacts; 
using Google.GData.Contacts; 
using Google.GData.Client; 
using Google.GData.Extensions; 
using Google.Apis.Auth.OAuth2; 
using Google.Apis.Calendar; 
using Google.Apis.Calendar.v3; 
using Google.Apis.Calendar.v3.Data; 
using System.Threading; 
using Google.Apis.Services; 

namespace MY 
{ 
class GoogleContact 
{ 
    static public void start_service() 
    { 

     UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
      new ClientSecrets 
      { 
       ClientId = "clientID", 
       ClientSecret = "clientsecret", 
      }, 
      new[] { CalendarService.Scope.Calendar, "https://www.google.com/m8/feeds/" }, // This will ask the client for concent on calendar and contatcs 
      "user", 
      CancellationToken.None).Result; 


     // Create the calendar service. 
     CalendarService cal_service = new CalendarService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Calendar API Sample", 
     }); 

     // How do I use the found credential to create a ContactsService???? 
     ContactsService service = new ContactsService("APP_NAME"); 


    } 

Я ценю любые отзывы о следующих шагах, которые я должен предпринять?

UPDATE, после получения обратной связи:

Я добавил следующий фрагмент кода для того, чтобы использовать контактные данные.

 // Get the tokens from the FileDataStore 
     var token = new FileDataStore("Google.Apis.Auth") 
      .GetAsync<TokenResponse>("user"); 

     OAuth2Parameters parameters = new OAuth2Parameters 
     { 
      ClientId = mSecrets.ClientId, 
      ClientSecret = mSecrets.ClientSecret, 
      // Note: AccessToken is valid only for 60 minutes 
      AccessToken = token.Result.AccessToken, 
      RefreshToken = token.Result.RefreshToken 
     }; 

     RequestSettings settings = new RequestSettings(
      "Contact API Sample", parameters); 
     ContactsRequest cr = new ContactsRequest(settings); 
     Feed<Contact> f = cr.GetContacts(); 
     // The AccessCode is automatically updated after expiration! 
     foreach (Contact c in f.Entries) 
     { 
      Console.WriteLine(c.Name.FullName); 
     } 

Сначала я прочитал токен доступа и токен обновления из FileDataStore.
Затем я настроил параметры OAuth2Parameters, используя токен, который я только что прочитал.
И теперь я могу построить новый ContactService и ContactsRequest.

К моему удивлению, токен доступа автоматически возобновляется после истечения срока действия также для ContactService.

ответ

2

Вы просто не можете.
Вы пытаетесь объединить две разные библиотеки (GData и API Google).

Документация по GData доступна в: https://code.google.com/p/google-gdata/ и пакете NuGet для Contact API доступна в: https://www.nuget.org/packages/Google.GData.Contacts/.

Клиентская библиотека API Google API для .NET является новой библиотекой. НО, к сожалению, API контактов не поддерживает его. Список всех поддерживаемых API Google доступен в: https://developers.google.com/api-client-library/dotnet/apis/, вы также можете найти страницу Getting Started.

UPDATE: Я не знаком с GData API, но ...

1) Вы можете добавить несколько областей, кроме календаря методу AuhorizeAsync включать контактные областей (если таковые имеются)

2) Вы можете использовать токен доступа + токен обновления из хранилища данных (по умолчанию вы используете FileDataStore и инициируете запрос GData (опять же, я не знаком с API), чтобы использовать токен доступа.

Это может сработать для вас, но вам нужно больше исследовать .. Я не пробовал этого, потому что я не знаком с GData.

UPDATE 2: Добавление правильного вызова FileDataStore:

var token = new FileDataStore("Google.Apis.Auth") 
    .GetAsync<TokenResponse>("user"); 
var accessToken = token.AccessToken; // valid for 60 minutes ONLY. 
var refreshToken = token.RefreshToken; 

Должен получить маркер ответ, содержащий доступ и обновить маркер.

** GoogleWebAuthorizationBroker несет ответственность за создание хранилища данных по умолчанию, используя указанную выше папку, если пользователь не предоставил один (ваш случай).

** Библиотека Auth несет ответственность за хранение правильных данных. Взгляните в authorization code flow для более подробной информации.

+0

Спасибо за четкий ответ! Означает ли это, что я должен дважды спросить пользователя? Сначала для данных календаря, с вышеуказанным фрагментом кода, а затем другим способом (?) Для контактных данных? Полагаю, странный пользовательский опыт. Возможно ли преобразовать информацию в UserCredential в OAuth2Parameters, которую я должен использовать для данных Contact? – Jelle

+0

обновил мой ответ. Я также добавлю тег gdata к вопросу :) – peleyal

+0

Я уже добавил область для контактов в метод AuthorizeAsync, который, по крайней мере, кажется, работает. Теперь я попытаюсь выяснить, могу ли я использовать информацию FileDataStore для использования с API-интерфейсом Gdata. Спасибо за ответы, я отвечу на исходный вопрос. – Jelle