Google 在没有浏览器的情况下驱动 OAuth2

Google drive OAuth2 without browser

我正在尝试通过 Google drive OAuth2 在我的 c# 桌面应用程序中验证我的登录。当用户输入 Client IDClient secret 时,浏览器打开并要求确认。 当用户输入错误的 Client IDClient secret 时浏览器也会打开,并在 Google 网页上显示错误消息...

那么,我可以在没有浏览器确认的情况下进行身份验证,并在我的代码中处理所有 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# 代码中捕获 Google OAuth exceptions 怎么样?因为现在 Google 只是在浏览器中向我显示错误信息,而我的应用程序只是挂起...

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

因此,如果您不想打开浏览器进行身份验证,Google Drive 有两种选择。如果您希望使用该应用程序的每个人共享 1 个 Google 驱动器,您可以设置一个服务帐户 https://developers.google.com/accounts/docs/OAuth2ServiceAccount

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

这些是没有浏览器的唯一方法,Google 不允许您再向他们传递用户名和密码。

更新--

您将需要这样的东西,这是供离线使用的,但在线会类似。

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 的例子 https://developers.google.com/drive/web/examples/dotnet

为了能够在每次 run/install 新设备上的应用程序时 使用相同的 google 帐户 您必须这样做 :

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

登录后,您可以看到在Debug/Release文件夹[=10=中生成了一个新文件和一个文件夹(名为token.json) ]

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

注意:确保token.json不为空

这个方法对我有用,希望对你也有用