有没有办法重用 Google.Apis.Auth.OAuth2.UserCredential 对象来授权 SpreadsheetsService?
Is there a way to reuse Google.Apis.Auth.OAuth2.UserCredential object to authorize SpreadsheetsService?
我正在尝试从 C# 控制台应用程序使用 Google Drive 和 Spreadsheets API。我想使用带有 FileDataStore
的用户凭据对这两项服务进行授权,这样我就不必在每次 运行 时都重新验证我的应用程序。以下是我如何授权我的云端硬盘服务对象:
var userCredential = GoogleWebAuthorizationBroker.AuthorizeAsync
(
new ClientSecrets
{
ClientId = "[clientID]",
ClientSecret = "[clientSecret]"
},
new []
{
"https://www.googleapis.com/auth/drive",
"https://spreadsheets.google.com/feeds"
},
"[userName]",
CancellationToken.None,
new FileDataStore("MyApp.GoogleDrive.Auth.Store")
).Result;
var driveService = new DriveService
(
new BaseClientService.Initializer
{
HttpClientInitializer = userCredential,
ApplicationName = "MyApp",
}
);
对于电子表格服务,我按照 this guide 的规定进行授权,但每次我 运行 我的应用程序,我都必须打开浏览器以进行给定的授权 URL并手动复制访问令牌以使其正常工作。
有没有办法只授权一次,像上面那样获取用户凭据,并在两种服务中使用它们?请注意,我正在授权 Drive 和 Spreadsheets 范围,所以我认为这没有问题。
我试过让它像这样工作,但是当我尝试将行插入我的电子表格时,我不断收到 400 Bad Request 错误:
var auth = new OAuth2Parameters
{
ClientId = "[clientID]",
ClientSecret = "[clientSecret]",
RedirectUri = "[redirectUri]",
Scope = "https://www.googleapis.com/auth/drive https://spreadsheets.google.com/feeds" ,
AccessToken = userCredential.Token.AccessToken,
RefreshToken = userCredential.Token.RefreshToken,
TokenType = userCredential.Token.TokenType,
};
var requestFactory = new GOAuth2RequestFactory(null, "MyApp", auth);
var spreadsheetsService = new SpreadsheetsService("MyApp")
{
Credentials = new GDataCredentials(userCredential.Token.TokenType + " " + userCredential.Token.AccessToken),
RequestFactory = requestFactory,
};
有没有办法只授权一次,获取上述用户凭据,并将其用于两种服务?
是的。如果您已包含所有范围并已请求离线访问,那么您将获得一个刷新令牌,您可以存储并重复使用该令牌以根据需要获取访问令牌。显然,您需要考虑安全隐患。
400 错误请求听起来不像是 OAuth 问题。我认为您这里有两个 questions/issues,可能值得开始一个新线程。在您的问题中包含 400 的 http request/response。
我正在尝试从 C# 控制台应用程序使用 Google Drive 和 Spreadsheets API。我想使用带有 FileDataStore
的用户凭据对这两项服务进行授权,这样我就不必在每次 运行 时都重新验证我的应用程序。以下是我如何授权我的云端硬盘服务对象:
var userCredential = GoogleWebAuthorizationBroker.AuthorizeAsync
(
new ClientSecrets
{
ClientId = "[clientID]",
ClientSecret = "[clientSecret]"
},
new []
{
"https://www.googleapis.com/auth/drive",
"https://spreadsheets.google.com/feeds"
},
"[userName]",
CancellationToken.None,
new FileDataStore("MyApp.GoogleDrive.Auth.Store")
).Result;
var driveService = new DriveService
(
new BaseClientService.Initializer
{
HttpClientInitializer = userCredential,
ApplicationName = "MyApp",
}
);
对于电子表格服务,我按照 this guide 的规定进行授权,但每次我 运行 我的应用程序,我都必须打开浏览器以进行给定的授权 URL并手动复制访问令牌以使其正常工作。
有没有办法只授权一次,像上面那样获取用户凭据,并在两种服务中使用它们?请注意,我正在授权 Drive 和 Spreadsheets 范围,所以我认为这没有问题。
我试过让它像这样工作,但是当我尝试将行插入我的电子表格时,我不断收到 400 Bad Request 错误:
var auth = new OAuth2Parameters
{
ClientId = "[clientID]",
ClientSecret = "[clientSecret]",
RedirectUri = "[redirectUri]",
Scope = "https://www.googleapis.com/auth/drive https://spreadsheets.google.com/feeds" ,
AccessToken = userCredential.Token.AccessToken,
RefreshToken = userCredential.Token.RefreshToken,
TokenType = userCredential.Token.TokenType,
};
var requestFactory = new GOAuth2RequestFactory(null, "MyApp", auth);
var spreadsheetsService = new SpreadsheetsService("MyApp")
{
Credentials = new GDataCredentials(userCredential.Token.TokenType + " " + userCredential.Token.AccessToken),
RequestFactory = requestFactory,
};
有没有办法只授权一次,获取上述用户凭据,并将其用于两种服务?
是的。如果您已包含所有范围并已请求离线访问,那么您将获得一个刷新令牌,您可以存储并重复使用该令牌以根据需要获取访问令牌。显然,您需要考虑安全隐患。
400 错误请求听起来不像是 OAuth 问题。我认为您这里有两个 questions/issues,可能值得开始一个新线程。在您的问题中包含 400 的 http request/response。