编程语言
首页 > 编程语言> > c#-不带浏览器的Google驱动器OAuth2

c#-不带浏览器的Google驱动器OAuth2

作者:互联网

我正在尝试通过c#桌面应用程序中的Google驱动器OAuth2对我的登录进行身份验证.当用户输入“客户端ID”和“客户端密码”时,浏览器将打开并要求确认.
当用户输入错误的客户端ID和客户端密码并在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

当此块中发生错误时,代码的执行就会停止,并且什么也不会发生.

UPDATE1:

OK,假设我知道如何使用令牌获取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已弃用所有以前的版本.

因此,如果您不想为Auth打开浏览器,则可以选择Google云端硬盘.如果您希望每个使用该应用程序的人共享1个Google云端硬盘,则可以设置一个服务帐户https://developers.google.com/accounts/docs/OAuth2ServiceAccount.

如果所有使用您的应用的人都将其安装在设备上并使用自己的Google驱动器,则可以将其设置为具有脱机/长期访问权限的已安装应用. 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

标签:google-api,google-drive-api,c
来源: https://codeday.me/bug/20191028/1954769.html