0

自从2011年11月起,我在ASP.NET应用程序中使用旧版本的Calendar GData API (v1, v2),允许用户在提交用户名和密码后检索和/或创建日历活动,直到2014年11月17日之前谷歌决定关闭这个版本的API作为宣布Calendar GData API/Google Calendar Connectors deprecation我的Google身份验证问题

现在我坚持的Google APIS Calendar (v3)的新版本,它迫使我使用认证过程的不同场景代替传统之一。我完全不介意使用此版本的Calendar API,因为它支持所有必需的功能,但现在我不知道如何处理多个用户身份验证,以便使用其每个用户代码控制台注册的用户客户端ID和秘密。

所以我的问题是:有没有办法让用户使用他/她的正常凭据登录(通过用户名/密码或Google+ Sign Up功能),并绕过创建API项目,启用所需的API和通过ASP.net代码在控制台内创建新的用户凭证?

任何在C#ASP.net中制作的示例代码都非常感谢。

编辑:这是我的验证码我用

public static CalendarService Authenticate() 
     { 
      CalendarService service; 
      GoogleAuthorizationCodeFlow flow; 
      string json_File = System.Configuration.ConfigurationManager.AppSettings["Authentication_Path"]; 
      string store_path = System.Configuration.ConfigurationManager.AppSettings["FileStore_Path"]; 
      string url = System.Configuration.ConfigurationManager.AppSettings["Authent_URL"]; 

      using (var stream = new FileStream(json_File, FileMode.Open, FileAccess.Read)) 
      { 
       flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer 
       { 
        DataStore = new FileDataStore(store_path), 
        ClientSecretsStream = stream, 
        Scopes = new[] { CalendarService.Scope.Calendar } 
       }); 
      } 
      var uri = url; 

      var result = new AuthorizationCodeWebApp(flow, uri, uri).AuthorizeAsync("TRAININGCALENDAR", CancellationToken.None).Result; 
      if (result.Credential == null) 
      { 
       GoogleCalendar_Bus.Main_Authentication(url, "", ""); 
      } 
      // The data store contains the user credential, so the user has been already authenticated. 
      service = new CalendarService(new BaseClientService.Initializer 
      { 
       ApplicationName = "Calendar API Sample", 
       HttpClientInitializer = result.Credential 
      }); 
      if (result.Credential != null) 
      { 
       service = new CalendarService(new BaseClientService.Initializer 
       { 
        ApplicationName = "Calendar API Sample", 
        HttpClientInitializer = result.Credential 
       }); 
      } 

      return service; 
     } 

回答

2

不,你需要使用Oauth2。当他们进行身份验证时,您只需保存刷新令牌,这将允许您获得新的访问令牌,并且您将再次访问。您需要自己执行Idatastore以将这些刷新令牌存储在数据库中。

创建Idatastore的实现,存储到数据库是广泛的,张贴在这里,但你可以在这里看到一个基本的例子代码:DatabaseDataStore.cs

然后你可以这样使用它。

credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        new ClientSecrets { ClientId = _client_id 
             ,ClientSecret = _client_secret } 
        ,scopes 
        ,Environment.UserName 
        ,CancellationToken.None 
        ,new DatabaseDataStore(@"LINDAPC\SQL2012", "LindaTest", "test123", "test", "test")).Result; 

更新:现在我可以看到您的代码。

  1. 请确保您拥有lanetted .net客户端库。 Google.Apis.Calendar.v3 Client Library
  2. 你的代码正在使用FileDataStore这是你需要改变的。您需要自己创建与我创建的DatabaseDatastore类似的Idatastore。

你的代码看起来和我通常做的不一样。

string[] scopes = new string[] { 
     CalendarService.Scope.Calendar , // Manage your calendars 
     CalendarService.Scope.CalendarReadonly // View your Calendars 
      }; 

      try 
      { 
       // here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData% 
       UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret } 
                    , scopes 
                    , userName 
                    , CancellationToken.None 
                    , new FileDataStore("Daimto.GoogleCalendar.Auth.Store")).Result; 



       CalendarService service = new CalendarService(new BaseClientService.Initializer() 
       { 
        HttpClientInitializer = credential, 
        ApplicationName = "Calendar API Sample", 
       }); 
       return service; 
      } 
      catch (Exception ex) 
      { 

       Console.WriteLine(ex.InnerException); 
       return null; 

      } 

这可能是由于你没有使用最最新的客户端的lib的事实,你可以找到谷歌日历here一个示例控制台应用程序遗憾的是该机还采用FileDatastore你必须编辑使用DatabaseDataStore。认证示例项目可以在这里找到Google-Dotnet-Samples/Authentication/它显示了如何创建自己的Idatastore实现。

我仍在编写该示例项目的教程,希望能尽快完成。

+0

感谢DalmTo提供此信息,但它确实没有任何意义,因为Google通过用户名和密码关闭了正常的身份验证过程,迫使每个用户(甚至是新用户访问我的应用程序)创建一个API项目,并且用户凭证开始使用Calendar API。那就是我的意思 !!!! – 2014-12-08 06:32:21