问题描述
我有一个winforms应用程序。此应用程序基本上用于备份和还原。用户可以登录到自己的Google Drive帐户,并使用Google Drive下载和上传文件。所有用户都启用自己的Google Drive API,并使用该帐户的凭据。这是不是一种严厉的方式?(#1问题)
我已经为此使用了Google驱动器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;
此代码在本地工作,也可以在生产中工作。但是,当我对代码进行混淆处理(混淆器: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驱动器登录页面,然后用户可以通过该页面登录或类似登录。
注意:使用此代码的第一次登录时,打开了google drive登录页面,我登录了我的帐户并获得了google应用程序的许可。然后网页转到api键。但这只发生在第一时间。我没有足够的信息。我遵循了本教程;
https://www.daimto.com/google-drive-authentication-c/
解决方法
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