【问题标题】:Google Drive API Files.List() Error invalid_grant Bad RequestGoogle Drive API Files.List() 错误 invalid_grant 错误请求
【发布时间】:2018-11-06 16:55:38
【问题描述】:

我正在使用 Google APIs Drive v3 并通过一个简单的请求来查找具有特定 ID 的文件夹,然后列出该文件夹中的所有文件。

但是根据请求执行它正在创建异常:

“Error: invalid_grant, Description: Bad Request, Uri:”

它曾经工作,但在上个月的某个时间停止了大约。当我在做另一个项目时。

我检查了 API 控制台,并且我们的客户端 ID 已注册(我已经散列了 ID、秘密和刷新令牌),并且在创建服务时一切似乎都正常,它正在发送不工作的请求。

但是查询过去可以工作,我已经尝试更改查询,但仍然无法正常工作。

代码如下,任何有关如何解决此问题的建议将不胜感激。谢谢

请求文件列表

    List<File> fileList = new List<File>();
        List<File> FileList_Lst_Ordered = new List<File>();
        try
        {
            string pageToken = null;
            do
            {
                request.Q = "'" + folderId + "' in parents";
                //request.Q = String.Format("name='{0}'", "Release Scripts Folder");
                //request.Q = "mimeType = 'application/vnd.google-apps.folder' + title='" + folderId +"'";

                request.Spaces = "drive";
                request.Fields = "nextPageToken, files(id, name, mimeType, trashed)";
                request.PageToken = pageToken;

                var result = request.Execute();

                // Iterate through files
                foreach (File file in result.Files)
                {
                    // If it is a matching type (or we are retreiving all files)
                    if (!(bool)file.Trashed && (file.MimeType == type || type == "ALL"))
                    {
                        fileList.Add(file);
                    }

                    //RST_00001
                    else if (!(bool)file.Trashed && (file.MimeType == "sql" || file.MimeType == "text/x-sql"))
                    {
                        fileList.Add(file);
                    }
                }

                // Increment file token
                pageToken = result.NextPageToken;
            } while (pageToken != null);

            //RST_00002: Order List Alphabetically
            int Counter_int = fileList.Count();
            for (int i = 1; i <= Counter_int; i++)
            {
                FileList_Lst_Ordered.Add(fileList.OrderBy(x => x.Name).FirstOrDefault());
                fileList.Remove(fileList.OrderBy(x => x.Name).FirstOrDefault());
            }

        }
        catch (Exception Ex)
        {
            errorString = Ex.Message;
            Helpers.Helpers_TextFile.TextFile_WriteTo(Log_Filename, "Error Occured While Obtaining script list for folder " + folderId + ", full error: " + Ex.ToString());
        }

在 GoogUtils.cs Helper 中初始化服务

        public static DriveService InitService(ref string errorString)
                {
                    try {
                        var token = new TokenResponse { RefreshToken = "###" };
                        var credentials = new UserCredential(new GoogleAuthorizationCodeFlow(
                            new GoogleAuthorizationCodeFlow.Initializer
                            {
                                ClientSecrets = new ClientSecrets
                                {
                                    ClientId = "###",
                                    ClientSecret = "###"
                                }
                            }),
                            "user",
                            token);

                        // Create Drive API service.
                        var service = new DriveService(new BaseClientService.Initializer()
                        {
                            HttpClientInitializer = credentials,
                            ApplicationName = ApplicationName,
                        });

                        return service;
                    }
                    catch (Exception e)
                    {
                        errorString = e.Message;
                    }

                    return null;
                }

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。对于第一个问题,这很好,但请清楚您的问题实际上是什么,以及您希望的结果对于那些可能能够发现问题但不熟悉应该发生的事情的人来说也是如此。考虑在你的代码块结束后回顾一下。
  • 用户已撤销权限,刷新令牌是否过期?
  • @pinoyyid 感谢您的建议,这是我要检查的第一件事。用户权限是我们检查的第一件事,在 API 控制台上,我检查了客户端 ID 是否已注册,在 Google Drive 中,我检查了文件夹的权限,它们看起来很好。控制台上是否还有其他位置可以检查文件夹权限或我可以执行的任何其他测试?刷新令牌在身份验证时看起来很好,当我创建服务时它很好,当我尝试运行请求时它会失败。
  • 您将身份验证与授权混淆了。您的应用程序是通过身份验证流程,还是依赖于存储的刷新令牌。您是否按照此处developers.google.com/identity/protocols/… 所述使用刷新令牌来测试它
  • @pinoyyid 感谢您的反馈。我们不在存储的刷新令牌上。虽然我正在根据本教程考虑它:daimto.com/google-oauth2-csharp 在此之前,我正在研究使用 C# 将访问令牌设置为脱机。

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


【解决方案1】:

我已经能够解决问题。通过重写服务使其使用 GoogleWebAuthorizationBroker.AuthorizeAsync 而不是 GoogleAuthorizationCodeFlow,我现在还从 JSON 加载凭据。见吹。 感谢大家的贡献和帮助:

 public static DriveService InitService(ref string errorString, string Log_Filename)
    {
        try
        {
            string[] Scopes = { DriveService.Scope.DriveReadonly };
            UserCredential credential;

            if (!System.IO.File.Exists(credential_json))
            {
                System.Windows.Forms.MessageBox.Show("Unable to Initialise Google Drives Service credentials not found.");
                Helpers.Helpers_TextFile.TextFile_WriteTo(Log_Filename, "Google Drive Init - Unable to Initialise Google Drives Service credentials not found.");
            }

            using (var stream = new FileStream(credential_json, FileMode.Open, FileAccess.Read))
            {
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                if (credential.UserId == "user")
                {
                    Helpers.Helpers_TextFile.TextFile_WriteTo(Log_Filename, "Google Drive Init - Credentials file saved to: " + credPath);
                }
                else {
                    Helpers.Helpers_TextFile.TextFile_WriteTo(Log_Filename, "Google Drive Init - Unable to verify credentials.");
                    return null;
                }
            }

            // Create Drive API service
            var service = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            // Validate Service
            if (service.Name == "drive" && service.ApplicationName == ApplicationName)
            {
                Helpers.Helpers_TextFile.TextFile_WriteTo(Log_Filename, "Google Drive Init - Google Service Created.");
            }
            else
            {
                Helpers.Helpers_TextFile.TextFile_WriteTo(Log_Filename, "Google Drive Init - Unable to create service.");
                return null;
            }

            return service;
        }
        catch (Exception Ex)
        {
            System.Windows.Forms.MessageBox.Show("An Error Occured While Initialising Google Drives Service");
            System.Windows.Forms.Clipboard.SetText(Ex.ToString());
            Helpers.Helpers_TextFile.TextFile_WriteTo(Log_Filename, "Google Drive Init - Error Occurred: " + Ex.ToString());
            errorString = Ex.Message;
        }

        return null;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多