1

我想让一个Web应用程序是ASP.NET MVC 5,通过它我可以使用Google帐户对用户进行身份验证,然后从存储在Google Drive/Google中的电子表格中读取数据表。重复使用GData API中的Google API凭证

我正在使用Google API验证用户身份。用户认证成功后,我得到的凭证从谷歌回到了一个对象,它是类型的Google.Apis.Auth.OAuth2.Web AuthResult.UserCredential

然后我就可以成功创建服务使用类似的代码从驱动器文件列出来

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获得的凭证?

+0

为什么不创建一个SpreadsheetsService?只要创建凭据时使用的范围允许驱动器和SpreadsheetsService,那么您就没有理由不能创建两者。 – DaImTo 2014-10-27 11:41:40

+0

我已经创建了一个'SpreadsheetsService'。我不想再次启动认证周期。我正在寻找一种在GData中使用来自API的凭证的方法 – 2014-10-27 11:51:18

+0

不要以为我明白创建新服务的问题不会再次启动身份验证,您已经有了result.credentials,只是在两者中都使用它。 – DaImTo 2014-10-27 12:04:45

回答

0

这是最终为我工作

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; 
相关问题