2

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

  UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }, 
           scopes, "XXXXXX", CancellationToken.None 
      ,new FileDataStore("XXXXXX") 
           ).Result; 

Если работы , но через один час, когда токен доступа недействителен, при повторном запуске AuthorizeAsync токены доступа, возвращаемые в объекте «учетные данные», не обновляются, как и должно быть (я щекотал значения в режиме отладки и токена доступа все тот же, не обновляется). Даже браузер не запускается, чтобы попросить пользователя предоставить разрешение (я использую его для API контактов Google).

Я использую OAuth2 с .Net клиентской библиотекой google для аутентификации, поскольку это намного проще, чем аутентификация с помощью библиотеки gdata. Тем не менее я использую старый gdata lib для обновления контактов gmail (новый API-интерфейс контакта не позволяет изменять данные контактных данных YET).

Есть ли проблема с смешиванием этих API? Должен ли я аутентифицировать библиотеку gdata?

Thanx.

ответ

1

Нет, возможно, самый простой способ аутентификации в gdata api - использовать библиотеку обнаружения для аутентификации.

Вы не показали, как вы применяете токен доступа к своему запросу gdata, но я собираюсь предположить, что он работает нормально.

Дело в том, что библиотека обнаружения, содержащая «GoogleWebAuthorizationBroker», использует FileDatastore для обновления вашего токена доступа. Он делает это, когда ему это нужно. Вы не делаете никаких запросов, использующих его, чтобы никогда не беспокоиться об обновлении токена доступа. Самый простой способ сделать это - сделать фиктивный запрос, используя api. Обычно я использую людей api.

People.get отправка параметра 'me' просто получает некоторую фиктивную информацию о текущем аутентифицированном пользователе. Если токен доступа истек, тогда он выберет новую.

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

Update:

вам нужно будет добавить объем PlusService.Scope.PlusMe или https://www.googleapis.com/auth/plus.login.

var service = new PlusService(new BaseClientService.Initializer() 
      { 
       HttpClientInitializer = credential, 
       ApplicationName = "Google Plus Authentication Sample", 
      }); 

// dummy call to api to refresh the auth token if needed. 
var refresh = service.People.Get("me").Execute(); 

Update2:

После немного покопаться в клиентской библиотеке я обнаружил, что существует способ для выгонки обновление токена доступа

var m = credential.GetAccessTokenForRequestAsync(); 

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

+0

Thanx DaImto. Я использовал код в вашем блоге http://www.daimto.com/google-contacts-with-c/ для использования запросов gdata. Фактически вы упомянули в этом блоге в разделе комментариев, которое вы проверили в режиме отладки, и увидите, что через час обновляется токен acces, возвращенный AuthorizeAsync.Я использовал тот же код, и это не так. Зачем ? Что касается обходного пути People.get, можете ли вы указать пример кода C#? –

+0

, вы можете попробовать сыграть с людьми api. https://developers.google.com/people/api/rest/v1/people.connections, похоже, читается из контактов google. – DaImTo

+0

Как создать объект «службы»? –