Получение ошибки - «Удаленный сервер возвратил ошибку: (401) Несанкционированный». при запросе файла с Google Drive API - PullRequest
0 голосов
/ 28 февраля 2020

При загрузке файлов с Google Диска, в частности с расширениями .docx, .do c или .pdf, мы теперь используем свойство "WebContentLink" через API filePicker в соответствии с недавней модификацией в Google Drive API, чтобы получить файл. (Ранее мы использовали свойство файла downloadUrl для загрузки файла через API filePicker).

Однако мы получаем это нежелательное исключение "401 - Несанкционированный доступ " при авторизации запросов на загрузку для API, использующий HttpWebRequest путем передачи заголовка с использованием токена на предъявителя.

Версия API Google Drive - v2

Используется - API выбора файлов для получения данных файла, т. Е. Идентификатор файла, webContentLink, alternateLink

Вот фрагмент кода, в котором мы реализовали логи c

//fileurl - webcontentlink of the file (previously, we used downloadUrl)
//accessToken - client's accessToken 
//filepath - location to store the downloaded file
public void downloadGdriveFileThroughWebRequest(string fileurl, string filepath, string accessToken)
        {
            HttpWebRequest rq = (HttpWebRequest)WebRequest.Create(fileurl);
            rq.Method = "GET";
            rq.PreAuthenticate = true;
            rq.Headers.Add("Authorization", "Bearer " + accessToken);
            try { 
            HttpWebResponse resp = (HttpWebResponse)rq.GetResponse();
            using (Stream output = File.OpenWrite(filepath))
            {
                using (Stream s = resp.GetResponseStream())
                {
                    byte[] buffer = new byte[8192];
                    int bytesRead;
                    while ((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        output.Write(buffer, 0, bytesRead);
                    }
                }
            }
            }

            catch (WebException ex)
            {
                using (var stream = ex.Response.GetResponseStream())
                using (var reader = new StreamReader(stream))
                {
                    reader.ReadLine();
                    Console.WriteLine(reader.ReadToEnd());
                }
            }
        }

Если мы не передаем заголовки, мы можем загрузить файл, но не можем прочитать и записать его данные, так что это бесполезно!

Есть ли альтернативное решение для загрузки запрошенного файла Google Диска с помощью запросов API с заголовками HTTP?

ПРИМЕЧАНИЕ. - Вот недавняя модификация API Google Drive и Picker - https://cloud.google.com/blog/products/application-development/upcoming-changes-to-the-google-drive-api-and-google-picker-api и мы уже внесли изменения.

1 Ответ

0 голосов
/ 09 марта 2020

Решение

Это решение предложено вам @RuchiYevle, оригинальным постером, который в комментариях разместил то, что сработало для него. Поэтому это будет опубликовано как вики сообщества.

Поскольку API Google Drive теперь больше не поддерживает функцию загрузки файлов с использованием downloadURL с использованием токена доступа, у нас будет вместо этого использовать URL googleapis.com/drive/v2/files{fileId}?alt=media.

Это сработало для меня, а также для предполагаемого поведения, упомянутого в их системе отслеживания проблем.

...