谷歌驱动OAuth2没有浏览器

时间:2015-01-21 23:01:53

标签: 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

当此块发生错误时,代码执行就会停止,没有任何反应。

UPDATE1:

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

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

另外,如何在我的c#代码中捕获Google OAuth exceptions? Couse现在谷歌只是在浏览器中显示错误信息而我的应用程序只是挂起......

2 个答案:

答案 0 :(得分:4)

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

如果您不想为Auth打开浏览器,那么Google云端硬盘有两种选择。如果您希望使用该应用的所有人共享1个Google云端硬盘,您可以设置服务帐户https://developers.google.com/accounts/docs/OAuth2ServiceAccount

如果使用您的应用的每个人都将其安装在自己的设备上并使用自己的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
});

这是Googles示例https://developers.google.com/drive/web/examples/dotnet

答案 1 :(得分:0)

要在每次在新设备上运行/安装应用程序时使用相同的Google帐户,您必须执行以下操作:

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

登录后,您会看到一个新文件和一个位于Debug / Release文件夹中的文件夹(称为token.json)

因此,要使用该帐户而无需打开浏览器即可授予权限(重复),您必须将这些文件和token.json文件夹与可执行文件(您的应用程序)保持在一起 < / p>

注意:确保token.json不为空

此方法对我有用,我希望它也适用