我正尝试在我的 c# 桌面应用程序中通过 Google drive OAuth2
验证我的登录。当用户输入 Client ID
和 Client secret
时,浏览器打开并要求确认。
当用户输入错误的 Client ID
和 Client 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/