我的Google身份验证问题

时间:2014-12-03 08:29:43

标签: c# asp.net google-calendar-api google-oauth google-api-dotnet-client

自2011年11月以来,我一直在我的ASP.NET应用程序中使用旧版本的Google Calendar GData API (v1, v2),允许用户在提交用户名和密码后检索和/或创建日历事件,这一过程非常有效2014年11月17日谷歌决定关闭此版本的API,如宣布Calendar GData API / Google Calendar Connectors deprecation

现在我被新版本的Google APIS Calendar (v3)所困扰,这迫使我使用不同的身份验证过程方案而不是传统方案。我根本不介意使用这个版本的Calendar API,因为它支持所有需要的功能,但现在我不知道如何处理多个用户身份验证以使用他们的用户客户端的ID和秘密根据每个用户代码控制台注册。

所以我的问题是:有没有办法让用户使用他/她的正常凭据(通过用户名/密码或Google+注册功能)登录并绕过创建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;
        }

1 个答案:

答案 0 :(得分: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. 确保您拥有latested .net客户端lib。 Google.Apis.Calendar.v3 Client Library
  2. 您的代码正在使用FileDataStore,这是您需要更改的内容。您需要创建自己的Idatastore实现,类似于我创建的DatabaseDatastore。
  3. 您的代码与我通常的代码有所不同。

    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;
    
                }
    

    这可能是因为您没有使用最新的客户端库,您可以找到Google日历here的示例控制台应用程序,不幸的是它还使用了FileDatastore,您将不得不编辑它以使用DatabaseDataStore。可以在此处找到身份验证示例项目Google-Dotnet-Samples/Authentication/,它显示了如何创建自己的Idatastore实现。

    我仍然正在编写该教程以继续该示例项目,我希望尽快完成。