c# - 没有浏览器的谷歌驱动 OAuth2

标签 c# google-api google-drive-api

我正尝试在我的 c# 桌面应用程序中通过 Google drive OAuth2 验证我的登录。当用户输入 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

当这个 block 中发生错误时,代码的执行就会停止,什么也不会发生。

更新 1:

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

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

此外,如何在我的 C# 代码中捕获 Google OAuth 异常?因为现在 Google 只是在浏览器中向我显示错误信息,而我的应用程序只是挂起...

最佳答案

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

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

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

这些是在没有浏览器的情况下执行此操作的唯一方法,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
});

这是谷歌的例子https://developers.google.com/drive/web/examples/dotnet

关于c# - 没有浏览器的谷歌驱动 OAuth2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28078490/

相关文章:

php - 刷新 oauth2 token google api 和 HWIOAuthBundle

java - Android:设置位置

c# - 如何从不同的线程访问变量?

c# - ReferenceEquals 使用字符串返回 false

c# - 使用 LINQ 排序不同的值

c# - 从大文件中删除不需要的字符

javascript - Google 可信商店 - 无需刷新页面即可确认订单

html - Google Drive 502 网关错误

android - Google 云端硬盘向我的 Android 应用程序返回错误 400 或 403?

python - 谷歌云端硬盘 : Getting a Suspended users permission Id