我的谷歌身份验证问题

本文关键字:问题 身份验证 谷歌 我的 | 更新日期: 2023-09-27 18:32:52

自2011年11月以来,我一直在我的 ASP.NET 应用程序中使用旧版本的Google日历GData API(v1,v2(,允许用户在提交用户名和密码后检索和/或创建日历事件,并且直到2014年11月17日Google决定关闭此版本的API之前,这一直运行良好 日历GData API/Google日历连接器弃用

现在我被困在新版本的Google APIS日历(v3(上,这迫使我使用不同的身份验证过程场景而不是传统的场景。 我完全不介意使用此版本的日历 API,因为它支持所有需要的功能,但现在我不知道如何处理多个用户身份验证以使用他们的用户客户端 ID 和密钥,这些 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;
        }

我的谷歌身份验证问题

不,您需要使用 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. 确保您拥有最新的 .net 客户端库。 Google.Apis.Calendar.v3 Client Library
  2. 您的代码正在使用文件数据存储,这是您需要更改的内容。您需要使自己的 Idatastore 实现类似于我创建的 DatabaseDatastore。

你的代码看起来与我通常的做法不同。

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日历的示例控制台应用程序,不幸的是它也使用FileDatastore,您必须对其进行编辑才能使用DatabaseDataStore。 身份验证示例项目可以在这里找到 Google-Dotnet-Samples/Authentication/它展示了如何创建自己的 Idatastore 实现。

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