Google OAuth2:何时以及如何使用刷新令牌
本文关键字:何使用 刷新 令牌 OAuth2 何时 Google | 更新日期: 2023-09-27 18:17:19
我有一个安装的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;
}
访问令牌将在1小时后过期-在此之后,当您对Google API进行调用时,您将开始收到"401 Invalid Credentials"错误。
我不熟悉。net Google API客户端库- Java和Python库会自动请求一个新的访问令牌,当这种情况发生时,这取决于你如何创建DriveService对象。我希望。net库也有类似的语义
如果有人仍然有刷新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);
}
何时使用刷新令牌:
从我的理解你使用刷新令牌时,你不希望验证你的应用程序每次启动。这对于应用程序开发期间的调试非常有用(因为手动身份验证在一段时间后会变得很烦人)。
如何使用刷新标记:
在最基本的意义上:
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如何处理刷新令牌