Google OAuth2: когда и как использовать токен обновления
У меня установлено приложение C# с работающим кодом, которое получает код авторизации и обменивает его на токен доступа. Я храню токен обновления. Я знаю, что в какой-то момент мне нужно использовать его для получения нового токена доступа. Давайте предположим, что я периодически вызываю следующий метод для отслеживания файлов, которые были предоставлены моей учетной записи Drive.
/// <summary>
/// Retrieve a list of File resources.
/// </summary>
/// <param name="service">Drive API service instance.</param>
/// <returns>List of File resources.</returns>
public static List<File> retrieveAllFiles(DriveService service) {
List<File> result = new List<File>();
FilesResource.ListRequest request = service.Files.List();
request.Q = "sharedWithMe and trashed=false";
do {
try {
FileList files = request.Fetch();
result.AddRange(files.Items);
request.PageToken = files.NextPageToken;
} catch (Exception e) {
Console.WriteLine("An error occurred: " + e.Message);
request.PageToken = null;
}
} while (!String.IsNullOrEmpty(request.PageToken));
return result;
}
}
Я предполагаю, что в какой-то момент вызов service.Files.List() не удастся. Как узнать, что произошел сбой из-за маркера доступа с истекшим сроком действия, и какой код используется для маркера обновления? У меня уже есть некоторый код (ниже), который я почерпнул здесь, чтобы использовать токен обновления. Будет ли вызван этот метод после истечения срока действия токена доступа?
private static IAuthorizationState GetAuthorization(NativeApplicationClient arg)
{
// If we already have a RefreshToken, use that
if (!string.IsNullOrEmpty(RefreshToken))
{
state.RefreshToken = RefreshToken;
if (arg.RefreshToken(state)) {
mTextBox.Text = "RF: " + RefreshToken;
return state;
}
}
// authCode is a TextBox on the form
var result = arg.ProcessUserAuthorization(mTextBox.Text, state);
RefreshToken = state.RefreshToken;
return result;
}
4 ответа
Если у кого-то все еще есть проблемы с обновлением AccessToken, возможно, это может помочь вам найти решение:
Google.GData.Client.RequestSettings settings = new RequestSettings("<AppName>");
Google.GData.Client.OAuth2Parameters parameters = new OAuth2Parameters()
{
ClientId = "<YourClientId>",
ClientSecret = "<YourClientSecret>",
AccessToken = "<OldAccessToken>", //really necessary?
RedirectUri = "urn:ietf:wg:oauth:2.0:oob",
RefreshToken = "<YourRefreshToken>",
AccessType = "offline",
TokenType = "refresh",
Scope = "https://www.google.com/m8/feeds/" //Change to needed scopes, I used this for ContactAPI
};
try
{
Google.GData.Client.OAuthUtil.RefreshAccessToken(parameters);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Срок действия маркера доступа истечет через 1 час. По истечении этого времени вы начнете получать ошибки "401 Invalid Credentials" при совершении вызовов с использованием API Google.
Я не знаком с клиентской библиотекой.NET Google API - библиотеки Java и Python автоматически сделают запрос на новый токен доступа, когда это произойдет, в зависимости от того, как вы создаете объект DriveService. Я ожидаю, что библиотека.NET будет иметь похожую семантику.
Когда использовать токен обновления:
Из того, что я понимаю, вы используете токен обновления, когда вы не хотите аутентифицировать свое приложение каждый раз, когда оно загружается. Это чрезвычайно полезно для отладки во время разработки приложения (поскольку ручная аутентификация может раздражать через некоторое время).
Как использовать токен обновления:
В самом основном смысле:
public static GOAuth2RequestFactory RefreshAuthenticate(){
OAuth2Parameters parameters = new OAuth2Parameters(){
RefreshToken = "<YourRefreshToken>",
AccessToken = "<AnyOfYourPreviousAccessTokens>",
ClientId = "<YourClientID>",
ClientSecret = "<YourClientSecret>",
Scope = "https://spreadsheets.google.com/feeds https://docs.google.com/feeds",
AccessType = "offline",
TokenType = "refresh"
};
string authUrl = OAuthUtil.CreateOAuth2AuthorizationUrl(parameters);
return new GOAuth2RequestFactory(null, "<YourApplicationName>", parameters);
}
Вы бы использовали этот метод в другом коде со службой, возможно, так
GOAuth2RequestFactory requestFactory = RefreshAuthenticate();
SpreadsheetsService service = new SpreadsheetsService("<YourApplicationName>");
service.RequestFactory = requestFactory;
Надеюсь это поможет!
Потратил последние два дня, чтобы понять, как использовать и обновить токен доступа с помощью токена обновления. Мой ответ размещен в другой теме здесь:
Как библиотека Google API V 3.0 .Net и Google OAuth2 обрабатывают токен обновления