Экран согласия пользователя отображается после истечения срока действия маркера доступа - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь интегрировать API Календаря Google в один из моих проектов Google App Engine, основанный на Spring Boot.Использование JAVA-библиотеки google-client-api для авторизации.Я предоставляю идентификатор клиента и секрет, созданные в моем проекте App Engine, для GoogleAuthorizationCodeFlow.При первом запуске я получил экран согласия пользователя, и после его принятия файл StoredCredential был создан в target / tokens.После этого все мои вызовы API Календаря Google работают нормально.Через некоторое время, которое, как мне кажется, связано с истечением срока действия маркера доступа, я снова получаю экран согласия пользователя.Согласно документации, если тип доступа установлен на offline, поток авторизации позаботится об управлении токенами обновления.Файл StoredCredential все еще находится в пути назначения / токенов, но я все еще вижу экран согласия пользователя.Вставка фрагмента кода авторизации.

  private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
    // Load client secrets.
    InputStream in = EventController.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
        .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
        .setAccessType("offline")
        .build();
    LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
    return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
  }

  public static Calendar get() throws GeneralSecurityException, IOException {
    // Build a new authorized API client com.huddle.processor.service.
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    return new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
        .setApplicationName(APPLICATION_NAME)
        .build();
  } 

Обновление: при удаленной отладке, когда google-oauth-client извлекает сохраненные учетные данные из файла с использованием

StoredCredential stored = credentialDataStore.get(userId);

токен обновления равен нулю.Интересно, не в этом ли причина, но не уверен, почему она не установлена.

Было бы замечательно, если бы кто-нибудь дал мне знать, что я пропустил.Спасибо

1 Ответ

0 голосов
/ 06 февраля 2019

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

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
        .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
        .setAccessType("offline")
        .setApprovalPrompt("force")
        .build();

Справочный блог, который мне помог: https://googlecode.blogspot.com/2011/10/upcoming-changes-to-oauth-20-endpoint.html

...