0

Я использую старую версию Google Calendar GData API (v1, v2) с ноября 2011 года в своих приложениях ASP.NET, позволяя пользователям извлекать и/или создавать события календаря после отправки их имен пользователей и паролей, и это отлично работает до 17 ноября 2014 года как раз перед Google решил закрыть эту версию API, как было объявлено Calendar GData API/Google Calendar Connectors deprecationМоя проблема с аутентификацией Google

Теперь я застрял с новой версией Google APIS Calendar (v3), которая заставляет меня использовать другой сценарий процесса аутентификации вместо традиционного. Я вообще не возражаю против использования этой версии API календаря, поскольку он поддерживает все необходимые функции, но теперь я не знаю, как обрабатывать аутентификацию нескольких пользователей, чтобы использовать их идентификатор и секретный код своего клиента, которые регистрируются для каждой пользовательской кодовой консоли.

Итак, мой вопрос: есть ли способ, чтобы пользователь мог войти с его/ее обычными учетными данными (либо по имени пользователя/паролю, либо в функции входа в Google+), либо в обход процесса создания API-проекта, в результате чего необходимые API-интерфейсы и создание новых учетных данных пользователя внутри консоли через код ASP.net?

Любой образец кода, сделанный на C# ASP.net, высоко оценен.

EDIT: Вот мой код проверки подлинности я использую

public static CalendarService Authenticate() 
     { 
      CalendarService service; 
      GoogleAuthorizationCodeFlow flow; 
      string json_File = System.Configuration.ConfigurationManager.AppSettings["Authentication_Path"]; 
      string store_path = System.Configuration.ConfigurationManager.AppSettings["FileStore_Path"]; 
      string url = System.Configuration.ConfigurationManager.AppSettings["Authent_URL"]; 

      using (var stream = new FileStream(json_File, FileMode.Open, FileAccess.Read)) 
      { 
       flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer 
       { 
        DataStore = new FileDataStore(store_path), 
        ClientSecretsStream = stream, 
        Scopes = new[] { CalendarService.Scope.Calendar } 
       }); 
      } 
      var uri = url; 

      var result = new AuthorizationCodeWebApp(flow, uri, uri).AuthorizeAsync("TRAININGCALENDAR", CancellationToken.None).Result; 
      if (result.Credential == null) 
      { 
       GoogleCalendar_Bus.Main_Authentication(url, "", ""); 
      } 
      // The data store contains the user credential, so the user has been already authenticated. 
      service = new CalendarService(new BaseClientService.Initializer 
      { 
       ApplicationName = "Calendar API Sample", 
       HttpClientInitializer = result.Credential 
      }); 
      if (result.Credential != null) 
      { 
       service = new CalendarService(new BaseClientService.Initializer 
       { 
        ApplicationName = "Calendar API Sample", 
        HttpClientInitializer = result.Credential 
       }); 
      } 

      return service; 
     } 

ответ

2

Нет, вы должны использовать Oauth2. Когда они аутентифицируются, вы просто сохраняете токен обновления, это позволит вам получить новый токен доступа, и вы снова получите доступ. Вам нужно будет сделать свою собственную реализацию Idatastore для хранения этих токенов обновления в базе данных.

Код для создания реализации Idatastore, которая хранит в базу данных является экстенсивным разместить здесь, но вы можете увидеть простой пример здесь: DatabaseDataStore.cs

Затем вы можете использовать его, как это.

credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        new ClientSecrets { ClientId = _client_id 
             ,ClientSecret = _client_secret } 
        ,scopes 
        ,Environment.UserName 
        ,CancellationToken.None 
        ,new DatabaseDataStore(@"LINDAPC\SQL2012", "LindaTest", "test123", "test", "test")).Result; 

Обновление: теперь, когда я вижу ваш код.

  1. Убедитесь, что у вас есть latested .net client lib. Google.Apis.Calendar.v3 Client Library
  2. Ваш код использует FileDataStore, это то, что вам нужно будет изменить. Вам нужно сделать свою собственную реализацию Idatastore аналогичной той, которую я создал DatabaseDatastore.

Ваш код отличается от того, как я обычно это делаю.

string[] scopes = new string[] { 
     CalendarService.Scope.Calendar , // Manage your calendars 
     CalendarService.Scope.CalendarReadonly // View your Calendars 
      }; 

      try 
      { 
       // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% 
       UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret } 
                    , scopes 
                    , userName 
                    , CancellationToken.None 
                    , new FileDataStore("Daimto.GoogleCalendar.Auth.Store")).Result; 



       CalendarService service = new CalendarService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Calendar API Sample", 
       }); 
       return service; 
      } 
      catch (Exception ex) 
      { 

       Console.WriteLine(ex.InnerException); 
       return null; 

      } 

Это может быть связанно с тем, что вы не используете самый последний клиент Lib, вы можете найти пример приложения консоли для Календаря Google here, к сожалению, он также использует FileDatastore вам придется редактировать использовать DatabaseDataStore. Проект примера проверки подлинности можно найти здесь Google-Dotnet-Samples/Authentication/ показывает, как вы можете создать свою собственную реализацию Idatastore.

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

+0

Спасибо DalmTo за эту информацию, но действительно не имеет никакого смысла, что Google отключает обычный процесс аутентификации по имени пользователя и паролю, заставляя каждого пользователя (даже новых пользователей для моего приложения) создавать проект API и User Credentials, чтобы начать использовать API календаря. Это то, что я имею в виду !!!! –

Смежные вопросы