我正在尝试制作一个使用ASP.NET MVC 5的web应用程序,使用该应用程序我可以使用Google帐户对用户进行身份验证,然后从存储在Google Drive/Google Sheets中的用户电子表格中读取数据。
我正在使用Google API对用户进行身份验证。在用户成功通过身份验证后,我在一个类型为Google.Apis.Auth.OAuth2.Web AuthResult.UserCredential
的对象中从Google取回凭据
然后,我可以使用类似的代码成功创建一个服务,从Drive列出文件
var driveService = new DriveService(new BaseClientService.Initializer
{
HttpClientInitializer = result.Credential,
ApplicationName = "ASP.NET MVC Sample"
});
现在,我想使用GData API从Drive中的电子表格中读取内容。为了实现这一点,我需要有一个SpreadsheetsService
对象,然后将它的RequestFactory
参数设置为GOAuth2RequestFactory
的实例,而这又需要在类OAuth2Parameters
的实例中指定OAuth2参数。
如何在GData Api中重用使用Google Api获得的凭据?
我已经在做你想做的事情了,
我如何传递GData令牌的代码谷歌电子表格的OAuth2身份验证问题
即,我使用单个OAuth2访问/刷新令牌集。对两个gdata调用使用相同的令牌&驱动API调用。
这是最终为我工作的代码
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "randomstring.apps.googleusercontent.com",
ClientSecret = "shhhhhh!"
},
Scopes = new[] { DriveService.Scope.Drive, "https://spreadsheets.google.com/feeds", "https://docs.google.com/feeds", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile" },
DataStore = new FileDataStore("Drive.Api.Auth.Store")
});
public override string GetUserId(Controller controller)
{
var user = controller.Session["user"];
if (user == null)
{
user = Guid.NewGuid();
controller.Session["user"] = user;
}
return user.ToString();
}
public override IAuthorizationCodeFlow Flow { get { return flow; } }
}
然后,在控制器中,OAuth2参数被复制到GData
var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
AuthorizeAsync(cancellationToken);
OAuth2Parameters parameters = new OAuth2Parameters();
parameters.ClientId = "somestring.apps.googleusercontent.com";
parameters.ClientSecret = "shhhhhh!";
parameters.Scope = result.Credential.Token.Scope;
parameters.AccessToken = result.Credential.Token.AccessToken;
parameters.RefreshToken = result.Credential.Token.RefreshToken;
GOAuth2RequestFactory requestFactory = new GOAuth2RequestFactory(null, "MySpreadsheetIntegration-v1", parameters);
SpreadsheetsService service = new SpreadsheetsService("MySpreadsheetIntegration-v1");
service.RequestFactory = requestFactory;