Обновить токен с помощью клиентской библиотеки Google API Java

Я использую Java-клиент Google API http://code.google.com/p/google-api-java-client/, и я могу успешно получить токен доступа для Android.

    // Google Accounts
credential = GoogleAccountCredential.usingOAuth2(this, CalendarScopes.CALENDAR);
SharedPreferences settings = getPreferences(Context.MODE_PRIVATE);
credential.setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));

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

В идеале я бы предпочел использовать Java-клиент Google API, а не WebView, чтобы получить токен обновления (не нужно вводить имя пользователя или пароль).

Любая помощь будет оценена по достоинству!


person Delos Chang    schedule 19.02.2013    source источник


Ответы (2)


Вы также можете сделать это, создав токен обновления, настроенный на идентификатор клиента OAuth 2.0.

Перейдите на страницу https://console.developers.google.com/apis/credentials.

  1. Нажмите «Создать учетные данные».
  2. Нажмите «Идентификатор клиента OAuth».
  3. Выберите «Веб-приложение» › Дайте имя.
  4. Добавьте https://developers.google.com/oauthplayground в раздел "Авторизованные URI перенаправления".
  5. Щелкните Создать.

Вам понадобятся ClientId и Secret для следующих шагов.

Затем перейдите на страницу https://developers.google.com/oauthplayground/.

  1. Нажмите «Конфигурация AOuth 2.0» в правом верхнем углу.
  2. Установите флажок «Использовать собственные учетные данные OAuth».
  3. Обновите «Идентификатор клиента OAuth» и «Секрет клиента OAuth», указав идентификатор клиента и секрет созданных выше учетных данных OAuth 2.0.
  4. На шаге 1 в левом углу выберите все необходимые области. (Обратите внимание, что несовпадающие области в запросе вернут «invalid_scopes».)
  5. Нажмите «Авторизовать API». Это перенаправит вас на страницу согласия, чтобы разрешить разрешения.
  6. На шаге 2 нажмите «Обменять код авторизации для токенов».
  7. Вы получите токен доступа с токеном обновления. Нам понадобится этот Refresh Token для следующего шага.

Вы можете использовать этот токен доступа для аутентификации в службах, которые вы указали в областях. Токены доступа недолговечны, а срок действия токенов обновления истекает через 24 часа, если только он не привязан к клиенту OAuth 2.0 (мы только что сделали наш токен обновления действительным до тех пор, пока он не будет отозван пользователем или истечет срок его действия из-за 6 месяцев бездействия).

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

    public String getNewToken(String refreshToken, String clientId, String clientSecret) throws IOException {
            ArrayList<String> scopes = new ArrayList<>();
    
            scopes.add(CalendarScopes.CALENDAR);
    
            TokenResponse tokenResponse = new GoogleRefreshTokenRequest(new NetHttpTransport(), new JacksonFactory(),
                    refreshToken, clientId, clientSecret).setScopes(scopes).setGrantType("refresh_token").execute();
    
            return tokenResponse.getAccessToken();
    }

clientId и clientSecret в приведенном выше примере относятся к учетным данным клиента OAuth 2.0.

Вы можете создать «GoogleCredential» с этим, как это

    public Credential getCredentials() throws GeneralSecurityException, IOException, FileNotFoundException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

        // Load client secrets.
        String CREDENTIALS_FILE_PATH = "/credentials.json"; //OAuth 2.0 clinet credentials json
        InputStream in = DriveQuickstart.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        String clientId = clientSecrets.getDetails().getClientId();
        String clientSecret = clientSecrets.getDetails().getClientSecret();

        GoogleCredential credential = new GoogleCredential.Builder()
                .setTransport(HTTP_TRANSPORT)
                .setJsonFactory(JSON_FACTORY)
                .setClientSecrets(clientId, clientSecret)
                .build();

        String refreshToken = "<REFRESH-TOKEN>"; //Find a secure way to store and load refresh token
        credential.setAccessToken(getNewToken(refreshToken, clientId, clientSecret));
        credential.setRefreshToken(refreshToken);

        return credential;
    }
person Pubudu Sitinamaluwa    schedule 07.11.2019
comment
Большое спасибо, это отлично решило мою проблему. - person Soufiane Odf; 31.12.2020

При запуске потока авторизации вам необходимо установить следующее:

  • приглашение на утверждение = принудительно
  • тип доступа = офлайн

Если установить эти параметры, Google вернет токен обновления, и библиотека будет обрабатывать обновления. Это работает для меня:

new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, getClientCredential(),
                Arrays.asList(SCOPES)).setCredentialStore(new OAuth2CredentialStore()).setAccessType("offline")
                .setApprovalPrompt("force").build();
person koma    schedule 22.02.2013
comment
Спасибо за помощь. Однако работает ли это с выбором учетной записи (т.е. работает ли это с GoogleAccountCredential?) - person Delos Chang; 01.03.2013
comment
Я думаю, поскольку GoogleAccountCredential реализует HttpRequestInitializer. но попытка помогает узнать ;) - person koma; 02.03.2013
comment
Я понятия не имею, как интегрировать это с GoogleAccountCredential, какие-нибудь подсказки? :( - person Goddchen; 05.03.2013