C# 不带浏览器的Google drive OAuth2

C# 不带浏览器的Google drive OAuth2,c#,google-api,google-drive-api,C#,Google Api,Google Drive Api,我正在尝试通过我的c#桌面应用程序中的Google drive OAuth2对我的登录进行身份验证。当用户输入客户ID和客户机密时,浏览器打开并请求确认。 当用户输入错误的客户ID和客户机密时,浏览器也会打开,并在谷歌网页上显示错误消息 那么,我可以在没有浏览器确认的情况下进行身份验证,并在代码中处理所有google OAuth2错误,而不使用任何浏览器页面吗 这是我的身份验证码: //...code string[] scopes = new string[] { DriveService.S

我正在尝试通过我的c#桌面应用程序中的Google drive OAuth2对我的登录进行身份验证。当用户输入
客户ID
客户机密
时,浏览器打开并请求确认。 当用户输入错误的
客户ID
客户机密时,浏览器也会打开,并在谷歌网页上显示错误消息

那么,我可以在没有浏览器确认的情况下进行身份验证,并在代码中处理所有google OAuth2错误,而不使用任何浏览器页面吗

这是我的身份验证码:

//...code
string[] scopes = new string[] { DriveService.Scope.Drive, DriveService.Scope.DriveFile };

UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
    new ClientSecrets
    {
        ClientId = "WrongID",
        ClientSecret = "WrongSecret"
    },
    scopes, _authUserName,
    CancellationToken.None, new FileDataStore(_authDataStorePath, true)).Result;
//...code
当这个块中发生错误时,代码的执行就停止了,什么也没发生

更新1:

好的,假设我知道如何获取带有标记的json文件。 现在,如何使用此文件创建DriveService对象? 现在我创建它如下所示:

DriveService _drive = new DriveService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential, // How to make this credential from tokens?
    ApplicationName = _applicationName
});

另外,在我的c#code中捕获
GoogleOAuth异常如何?因为现在谷歌只是在浏览器中向我显示一个错误信息,而我的应用程序只是挂起…

ClientId和Client Secret用于识别你的应用程序。这些需要硬编码或从数据库中提取,而不是由用户输入。至于OAuth2没有打开浏览器。使用API V3你不能再这样做了,谷歌已经弃用了所有以前的版本

因此,如果您不想为Auth打开浏览器,那么使用Google Drive有两种选择。如果你想让每个使用该应用程序的人共享一个Google drive,你可以设置一个服务帐户


如果每个使用你的应用程序的人都将其安装在自己的设备上并使用自己的Google drive,你可以将其设置为具有离线/长期访问权限的已安装应用程序。谷歌并没有很好地记录这一点,但如果你搜索它,有几个很好的例子。您将打开浏览器一次,以获取该用户的刷新令牌,然后将其存储在数据库中,这样您就可以在每次用户进入时访问其驱动器,而无需打开浏览器

这些是在没有浏览器的情况下实现的唯一方法,谷歌不再允许你向他们传递用户名和密码

更新--

你将需要这样的东西,这是为离线,但在线将类似

string path = whereYouSaveClientSecret+ "client_secret.json";
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
        StoredResponse myStoredResponse = new StoredResponse(RefreshToken);
        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
        GoogleClientSecrets.Load(stream).Secrets,
            new[] { DriveService.Scope.Drive},
            "user",
            CancellationToken.None,
            new SavedDataStore(myStoredResponse)).Result;
}
DriveService _drive = new DriveService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential, 
    ApplicationName = _applicationName
});

这是谷歌的一个例子,每次在新设备上运行/安装应用程序时,都可以使用同一个谷歌帐户

使用Google Drive Api并登录到您的帐户以授予权限

登录后,您可以看到调试/发布文件夹中生成的新文件和文件夹(称为token.json)

因此,为了能够在不打开浏览器授予权限(重复)的情况下使用该帐户,您必须将这些文件和token.json文件夹与可执行文件(您的应用程序)

注意:确保token.json不是空的


这种方法对我很有效,我希望也对你有效。

需要更多关于在没有浏览器的情况下如何进行身份验证的信息。“你只需打开浏览器一次,即可获取该用户的刷新令牌,然后将其存储在数据库中,这样,你就可以在他们每次上车时访问他们的驱动器,而无需打开浏览器。”是一种方法,但对于这种情况,也可以使用OAuth游乐场生成刷新令牌。请看,我知道如何获取令牌,我不知道如何使用它们创建
DriveService
对象。。。另外,用户可以点击页面上的取消按钮,我需要取消,但我不能这样做,正如我在上面所说的……实际上,现在我只需要一个关于使用令牌创建DriveService对象的帮助,有人能告诉我怎么做吗?根据您使用的是服务帐户还是离线或在线应用程序,设置您的凭据会有点不同。我会更新我的帖子,让你了解基本知识。