使用 Google Picker API 后尝试下载文件时出现错误 401 修改点:修改后的脚本:注意:参考:

问题描述

我有一个 React 应用程序,允许用户输入特定的 Google 文档,然后我们分析其内容。对于第 1 步,选择文档,我使用 this nifty npm package,它还会返回给我一个“OAuth 令牌”,我认为它是一个 String*,我可以用它来进行 API 调用。我将返回的令牌和 Picker API 返回的数据设置为组件中的状态变量,如下所示

@main def prog(c:Char,n:Int,rest:String*) =
   println(s"$c:$n and ${rest.length} other args")

然后我尝试调用 Drive API export function 以在此函数中下载所述文件

access_token

但是,我在执行此操作时收到 401 错误。有人可以指出我在哪里丢失身份验证吗?非常感谢


在下面编辑我的整个组件

<GooglePicker clientId={process.env.REACT_APP_GOOGLE_CLIENT_ID}
  developerKey={process.env.REACT_APP_GOOGLE_API_KEY}
  scope={ScopES}
  onAuthenticate={(token: any) => {
    setGoogletoken(token)
  }}
  onChange={(data: any) => {
    setGoogleData(data);
    nextOnboardingStage();
  }}
  onAuthFailed={(data: any) => console.log('on auth Failed:',data)}
  multiselect={true}
  navHidden={true}
  authImmediate={false}
  mimeTypes={['application/vnd.google-apps.document']}
  viewId={'DOCS'}>
  <MyCustomButton />
</GooglePicker>

编辑

正如@Tanaike 所说,我需要在我的请求中包含 MimeType,工作功能如下

const downloadGoogleDoc = async (authToken: string,fileID: string) => {
  const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`,{
    headers: {
      'Authorization': `token ${authToken}`
    }
  });
  console.log(res);
};

解决方法

我相信你的目标和你的情况如下。

  • 您想知道 401 错误的原因。
  • 根据您的脚本,我认为您可能想要下载不是 Google 文档文件(文档、电子表格、幻灯片等)的文件。
    • 因为下载 Google Docs 文件时,端点不正确。使用Drive API v3中的“文件:导出”方法时,需要使用mimeType进行导出。
    • 但从您的回复中,我了解到您想使用“文件:导出”的方法下载 Google 文档文件。
  • 您的访问令牌可用于从 Google 云端硬盘下载文件。

修改点:

  • 当我看到您的以下脚本时,我注意到除了端点之外的一个修改点。

      const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`,{
        headers: {
          'Authorization': `token ${authToken}`
        }
      });
    
    • 在这种情况下,token 不正确。请修改为Bearer。我认为这就是错误 401 的原因。
  • 当使用 catch 时,可以检索错误信息。

  • 如果下载二进制文件,则直接检索二进制数据。那时,当使用responseType: 'arrayBuffer'responseType: 'blob'时,数据分别作为数组缓冲区和blob检索。

当以上几点反映到你的脚本中时,它变成如下。

修改后的脚本:

从:
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`,{
  headers: {
    'Authorization': `token ${authToken}`
  }
});
到:
const mimeType = "###"; // Please set the mimeType.
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export?mimeType=${mimeType}`,{
  // responseType: `arrayBuffer`,// or 'blob'
  headers: {
    'Authorization': `Bearer ${authToken}`
  }
}).catch(err => console.log(err.response));
console.log(res);  // or res.data

注意:

  • 在这个修改后的脚本中,它假设您的访问令牌可用于从 Google Drive 下载文件。所以请注意这一点。

  • 当您使用“文件:导出”方法时,请使用Google Docs文件作为文件ID。请注意这一点。 Ref

参考: