1

Использование библиотеки Google.Apis.Analytics.v3 в .NET, я делаю аутентификации OAuth2 к API Google Analytics, например:Google API: Как проверить, успешно ли выполнена аутентификация?

string[] scopes = new string[] { AnalyticsService.Scope.Analytics, // view and manage your analytics data 
              AnalyticsService.Scope.AnalyticsEdit, // edit management actives 
              AnalyticsService.Scope.AnalyticsManageUsers, // manage users 
              AnalyticsService.Scope.AnalyticsReadonly};  // View analytics data 

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

AnalyticsService service = new AnalyticsService(new BaseClientService.Initializer() 
{ 
    HttpClientInitializer = credential, 
    ApplicationName = "Masterpiece" 
}); 

Проблема с этим состоит в том, что в конце концов, я дон 't знать, была ли аутентификация успешной или нет, поскольку я не вижу никакого способа получить какое-либо сообщение из этой реализации. Обычно это работает отлично, и я могу продолжить допрос API. Однако, если я отменяю токен, который я сохранил для этого имени пользователя, то эта реализация не скажет мне, что служба не была аутентифицирована, и когда я пытаюсь допросить API, я получаю сообщение об ошибке.

Как в мире проверить, успешно ли выполнена проверка подлинности, прежде чем я начну обращаться к методам API? Если аутентификация не удалась, я хочу удалить токен отзыва из своего хранилища данных и повторить проверку подлинности, запрашивая разрешение пользователя.

ответ

1

На самом деле есть несколько вещей, которые могут пойти не так, как вы должны подумать.

  1. Пользователь может нажать кнопку «Принять». Хорошо. Здесь нет проблем, вы можете проверить credential.Token.AccessToken, чтобы увидеть, что у вас есть токен доступа и вы можете получить доступ к API.
  2. Пользователь не нажимает кнопку «Принять», а вместо этого нажимает «cancle». В этом случае исключение - это бросок. Вот почему ваш код выше, вероятно, должен быть в попытке поймать. [System.AggregateException] InnerException = {"Ошибка: \" access_denied \ ", Описание: \" \ ", Uri: \" \ ""}
  3. Третий вариант заключается в том, что пользователь ничего не делает, и в этом случае ваш код будет висеть ожидая результата от пользователя. (Bug report: все еще работает над решением для этого)

Теперь вы беспокоитесь, что если вы удалите пользователя в вашем DatabaseDataStore, что произойдет. Хорошо, что должно произойти, так же, как если бы появился новый пользователь. Если ваш код в DatabaseDataStore правильный, система обнаружит, что у него нет этого пользователя, и снова запросит пользователя для аутентификации. Клиентская библиотека должна сделать это для вас, или, скорее, DatabaseDataStore. Я рекомендую тестировать с пользователем и FileDataStore, чтобы узнать, как это работает. Если ваш пользователь не запрашивает новую аутентификацию при удалении пользователя из системы, в вашем DatabaseDataStore что-то не так.

Рекомендации.

  1. Не запрашивайте, чтобы все эти области запрашивали только то, что вам нужно.
  2. Положите ваш код в попытку поймать в случае, если вы не получите аутентификацию, и он собирается выбросить ошибку, которая вам понадобится, чтобы поймать его.
  3. Тест на AccessToken, если вы действительно беспокоитесь об этом.

enter image description here

+0

Привет, спасибо за объяснение. Однако мой сценарий несколько отличается. У меня действительно есть try/catch, и он обрабатывает случай, когда пользователь нажимает на отмену. Но в описанном мной сценарии пользователь уже прошел аутентификацию в прошлом, и теперь администратор отменяет один из токенов, но не удаляет их из БД. Когда сайт снова попытается подключиться к GA, он будет использовать отмененный токен, который он найдет в базе данных. Учетные данные.Token возвращает только тот же отозванный токен, который я первоначально отправил, и не выдает ошибку. Http: // скринкаст.com/t/Eum96s3chP – SsjCosty

+0

Ваш databasedatastore должен обрабатывать администратора, который не полностью удаляет токен обновления – DaImTo

+0

Правильно ... но как хранилище данных узнает, что токен отменен? Вы можете отменить токен, вызывая URL-адрес (https://accounts.google.com/o/oauth2/revoke?token={token}), но как хранилище данных проверяет, отменен ли токен или нет? – SsjCosty