【问题标题】:How can I authenticate users to their own google drive account?如何验证用户到他们自己的谷歌驱动器帐户?
【发布时间】:2020-08-24 09:24:02
【问题描述】:

我有一个 winforms 应用程序。此应用程序基本上用于备份和恢复。用户可以登录自己的 google drive 帐户并使用 google drive 下载和上传文件。所有用户都启用他们自己的 google drive API 并使用该帐户的凭据。这是正确的方式吗?(#1问题)

我已经为此使用了 google drive api (v3),但身份验证方法无法按预期工作。

credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        new ClientSecrets
                        {
                            ClientId = this.ClientId,
                            ClientSecret = this.ClientSecret
                        },
                        _scopes,
                        Environment.UserName,
                        CancellationToken.None,
                        new FileDataStore("Drive.Api.Auth.Store")).Result;

此代码在本地工作,也可以在生产环境中工作。但是当我混淆(obfuscator: confuserex) 代码时,这个方法会抛出一个错误。错误;

One or many error occurred
System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)   location: System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)   location: System.Threading.Tasks.Task`1.get_Result()   location: App.Driver.GoogleDrive.DriveConnection.Authentication()

我想知道我可以用不同的方式对用户进行身份验证吗?(#2 问题)比如,打开一个谷歌驱动器登录页面,用户可以从中登录或类似的东西。

注意:在第一次使用此代码登录时,打开了 google drive 登录页面,我登录了我的帐户并获得了 google 应用程序的权限。然后网页转到api键。但这只是第一次发生。我没有这方面的好信息。我按照本教程进行操作;

https://www.daimto.com/google-drive-authentication-c/

【问题讨论】:

  • 第一次使用应用程序时会设置 cookie,并且 cookie 会在 cookie 到期之前一直有效。
  • @jdweng 你确定 winform 应用程序有 cookie 不只是用于 Web 应用程序吗?
  • 本地环境和生产环境有什么区别?我希望在用户机器上安装一个 winform 应用程序。
  • Environment.UserName,
  • 您正在使用 GoogleWebAuthorizationBroker。在本地机器上拥有一个作为 Web 应用程序的应用程序并且客户端也在同一台机器上是很常见的。它可以是窗口窗体项目的一部分。

标签: c# winforms google-api google-drive-api google-api-dotnet-client


【解决方案1】:
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                        new ClientSecrets
                        {
                            ClientId = this.ClientId,
                            ClientSecret = this.ClientSecret
                        },
                        _scopes,
                        Environment.UserName,
                        CancellationToken.None,
                        new FileDataStore("Drive.Api.Auth.Store")).Result;

上面的代码有两个关键点。

文件数据存储用于在用户对您的应用程序进行身份验证后存储用户凭据,默认情况下,凭据存储在 %appData% 中。当用户通过身份验证时,将根据 Environment.UserName 为每个登录的用户存储凭据

当应用程序第一次运行时,库将检查 %appData% 以获取 Environment.UserName 的凭据文件。如果它没有找到,那么将向用户呈现任一网页打开并且用户请求同意应用程序访问他们的数据。如果应用程序检测到 %appData% 中已经有一个文件用于 Environment.UserName 的凭据文件,则不会向用户显示同意屏幕。

控制谁在运行您的应用程序并相应地更改您使用 Environment.UserName 发送的字段

如果您对 IDatastore 的工作原理有深入了解,可以阅读我关于它的文章 Google .net – FileDatastore demystified

【讨论】:

  • 感谢您的回答。现在我明白为什么了。那么,我可以在不启用 google drive api 的情况下使用只有 google 帐户信息(没有客户端 ID 和客户端密码)的 google drive 吗?因为启用google drive api和从google app获取凭证的过程有点复杂
  • 如果您希望它只访问您自己的帐户,那么您应该使用服务帐户。你可以在这里阅读它service account这里有一些示例代码可以帮助你入门。 ServiceAccount.cs 这仅用于访问您开发人员控制的单个帐户。如果您想访问用户帐户,则需要使用 Oauth2,这是您现在使用的方法。
  • 只有 google 帐户信息 您指的是客户端登录信息,该信息已于 2015 年关闭,您需要在使用 Google api 时创建某种类型的凭据,这就是 google使用其 API 跟踪应用程序。
  • 您解决了我的一些问题,但我仍然收到此错误(我在问题中提到了该错误)。你对此有什么想法吗?当我使用 ConfuserEx 混淆代码时发生此错误。当我不这样做时不会发生错误。我认为某些原因导致 GoogleWebAuthorizationBroker 出现问题。再次感谢您的帮助。
  • @gurcansbr 如快速入门示例所述,建议您将 new FileDataStore("Drive.Api.Auth.Store")).Result; 更改为 new FileDataStore(LOCAL_PATH_STRING, True)).Result;
猜你喜欢
  • 2018-04-13
  • 2022-07-25
  • 2021-10-05
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2019-10-12
相关资源
最近更新 更多