Как получить токен доступа с помощью токена обновления в Java?

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

Теперь у меня с собой CLIENT_ID , CLIENT_SECRET AND REFRESH_TOKEN. Но срок действия токена доступа истекает в течение часа.

Может ли кто-нибудь сказать, как автоматически сгенерировать токен доступа с помощью токена обновления в Java?


person Santhosh    schedule 18.06.2018    source источник


Ответы (2)


Вы можете использовать клиентскую библиотеку Google OAuth2 для получения нового токена доступа с помощью токена обновления.

Вот мой код для получения нового токена доступа:

public TokenResponse refreshAccessToken(String refreshToken) throws IOException {
    TokenResponse response = new GoogleRefreshTokenRequest(
            new NetHttpTransport(),
            new JacksonFactory(),
            refreshToken, 
            "your clientId",
            "your clientSecret")
            .execute();
    System.out.println("Access token: " + response.getAccessToken());

    return response;
}

Для получения дополнительной информации прочтите официальное руководство по Google API:

person Sriram    schedule 27.01.2020

Я реализовал этот сценарий двумя способами. Не уверен, что они лучшие или нет, но мне они подходят.

В обоих случаях вам необходимо сохранить токен обновления вместе с идентификатором электронной почты пользователя. Затем вам нужно сделать HTTP-запрос в формате ниже.

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=**<your_client_id>**&
client_secret=**<your_client_secret>**&
refresh_token=**<refresh_token>**&
grant_type=refresh_token

Он вернет access_token и expires_in Источник

Теперь вопрос в том, как и когда делать http-запрос. Так что для этого у меня есть два пути.

1-й

Сохраните адрес электронной почты, токен обновления, токен доступа и текущее время + 3600 секунд. В своей базе данных вы можете запланировать проверку времени истечения каждые 5 минут, и если текущее время любого пользователя достигнет (до 5 или 10 минут) времени истечения, получите токен обновления и обновите значение для этого конкретного пользователя. И во время вызова api просто получите токен доступа пользователя.

2-й

Когда пользователь входит на ваш сайт, получает токен доступа и текущее время + 3600 секунд и сохраняет его в файлах cookie браузера. Теперь, прежде чем выполнять любой вызов api, просто проверьте, меньше ли текущее время (время, когда выполняется вызов api), чем время истечения срока действия (хранящееся в файле cookie). Если это правда, вы можете использовать предыдущий токен доступа, иначе получите новый и снова обновите файл cookie. Также вы должны поставить другое условие, что если файл cookie вообще отсутствует, вам также необходимо получить новый токен обновления.

person Dev    schedule 18.06.2018
comment
Спасибо за ваш ответ . Но я не могу понять ваш формат HTTP-запроса. Можете ли вы объяснить, как использовать идентификатор клиента, секрет клиента и токен обновления в HTTP-запросе для создания нового токена доступа. - person Santhosh; 18.06.2018
comment
вам необходимо отправить HTTP-запрос POST на googleapis.com/oauth2/v4/token URL со следующим телом запроса client_id: <YOUR_CLIENT_ID>, client_secret: <YOUR_CLIENT_SECRET>, refresh_token: <REFRESH_TOKEN_FOR_THE_USER>, grant_type: refresh_token - person Dev; 18.06.2018
comment
Теперь я получаю исключение: исключение в потоке main java.io.IOException: сервер вернул код ответа HTTP: 401 для URL: googleapis.com/oauth2/v4/token. Вот мой код stackoverflow.com/questions/50907105/. Подскажите, в чем я ошибаюсь. - person Santhosh; 18.06.2018