前端的GooglePicker(用户在reactJS中登录)和后端的GoogleDrive下载(node.js),API v3

前端的GooglePicker(用户在reactJS中登录)和后端的GoogleDrive下载(node.js),API v3,node.js,reactjs,oauth-2.0,google-drive-api,google-picker,Node.js,Reactjs,Oauth 2.0,Google Drive Api,Google Picker,我正在构建一个文件上传器,它为用户提供了一个从谷歌硬盘上传文件的选项。GooglePicker是在前端(reactJS)上设置和工作的,我有GooglePicker提供的fileID和OAuth令牌。我将这些文件发送到后端(node.js),并将GoogleDriveAPI放在那里。我按照文档的说明,将oauth令牌放在drive.files.get中的auth参数中,现在出现以下错误 Error GaxiosError: [object Object] at Gaxios._requ

我正在构建一个文件上传器,它为用户提供了一个从谷歌硬盘上传文件的选项。GooglePicker是在前端(reactJS)上设置和工作的,我有GooglePicker提供的fileID和OAuth令牌。我将这些文件发送到后端(node.js),并将GoogleDriveAPI放在那里。我按照文档的说明,将oauth令牌放在drive.files.get中的auth参数中,现在出现以下错误

Error  GaxiosError: [object Object]
    at Gaxios._request (/home/.../node_modules/gaxios/src/gaxios.ts:112:15)
    at processTicksAndRejections (internal/process/task_queues.js:97:5) {
  response: {
    config: {
      url: 'https://www.googleapis.com/drive/v3/files/1GqxjzMjrDdJquOPeMrFGIMngE20vTrjU?alt=media&key=ya29.6q33c6T418VuSILwq...cLKnBMKEG4vhui8K',
      method: 'GET',
      responseType: 'stream',
      userAgentDirectives: [Array],
      paramsSerializer: [Function],
      headers: [Object],
      params: [Object],
      validateStatus: [Function],
      retry: true,
      retryConfig: [Object]
    },
    data: PassThrough {
      _readableState: [ReadableState],
      readable: true,
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      _writableState: [WritableState],
      writable: false,
      allowHalfOpen: true,
      _transformState: [Object],
      [Symbol(kCapture)]: false
    },
    headers: {
      'alt-svc': 'h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"',
      'cache-control': 'private, max-age=0',
      connection: 'close',
      'content-length': '176',
      'content-type': 'application/json; charset=UTF-8',
      date: 'Wed, 16 Dec 2020 11:42:15 GMT',
      expires: 'Wed, 16 Dec 2020 11:42:15 GMT',
      server: 'UploadServer',
      vary: 'Origin, X-Origin',
      'x-guploader-uploadid': 'ABg5-Uw8z7O1Hpe1od4_dQF9So652TfYS0Mc1vpIu3t4DDXPzB7YvNwQAeHKCvoNBF-7m_pW9e8EHPOgrEHS84HWR7M'
    },
    status: 400,
    statusText: 'Bad Request',
    request: {
      responseURL: 'https://www.googleapis.com/drive/v3/files/1GqxjzMjrDdJquOPeMrFGIMngE20vTrjU?alt=media&key=ya29.6q33c6T418VuSILwq...cLKnBMKEG4vhui8K'
    }
  },
  config: {
    url: 'https://www.googleapis.com/drive/v3/files/1GqxjzMjrDdJquOPeMrFGIMngE20vTrjU?alt=media&key=ya29.6q33c6T418VuSILwq...cLKnBMKEG4vhui8K',
    method: 'GET',
    responseType: 'stream',
    userAgentDirectives: [ [Object] ],
    paramsSerializer: [Function],
    headers: {
      'x-goog-api-client': 'gdcl/4.4.3 gl-node/12.19.0 auth/6.1.3',
      'Accept-Encoding': 'gzip',
      'User-Agent': 'google-api-nodejs-client/4.4.3 (gzip)'
    },
    params: {
      alt: 'media',
      key: 'ya29.6q33c6T418VuSILwq...cLKnBMKEG4vhui8K'
    },
    validateStatus: [Function],
    retry: true,
    retryConfig: {
      currentRetryAttempt: 0,
      retry: 3,
      httpMethodsToRetry: [Array],
      noResponseRetries: 2,
      statusCodesToRetry: [Array]
    }
  },
  code: '400'
}
这里我观察到,有一个“key”参数,但据我所知,应该有一个授权令牌。我尝试使用来自POSTMAN的文件url,使用授权持有者的GET调用,但它以登录页面响应

问题:

  • 既然我提供了一个令牌,它不应该直接下载文件吗
  • 为什么文件不在后端下载
  • 注意:我确实遵循了node.js上的GoogleDriveAPI文档,但即使是这样,也会提示用户登录,但事实并非如此

    编辑:还添加了客户端代码

    客户端(reactjs)

    • 定义
      const drive=google.drive({version:'v3',auth:XXX})
      时,需要将函数
      authorize()
      的响应分配给
      authorize
      ,如
    • 请按照完整的快速启动获取有效的经过身份验证的客户端
    • 如果您不希望使用oAuth2客户端创建身份验证,那么还可以使用其他选项创建有效的凭据,请参阅

    我已经在进行身份验证的地方添加了客户端代码。我已经从用户登录的前端google picker获得了一个令牌!这个令牌是我用来下载所选文件的,对吗?我遗漏了什么?Google Picker和Google drive API遵循不同的身份验证流程。如果您已经设置了GooglePicker,为什么不使用它直接通过XML请求下载文件,而不是尝试将其与GoogleDrive API合并?请参阅以获取示例。好的,我应该将文件上载到后端的s3 bucket中,然后对其进行处理。我在后端已经有了上传配置,不想在前端复制它,但我认为这是剩下的唯一选择。非常感谢@ziganotschka的帮助!
                    <GooglePicker
                        clientId={"7...b.apps.googleusercontent.com"}
                        developerKey={"AIz...PY"}
                        scope={["https://www.googleapis.com/auth/drive.readonly"]}
                        onChange={handleFileChange}
                        onAuthenticate={(token) => setDownloadToken(token)}
                        onAuthFailed={(data) => console.log("on auth failed:", data)}
                        multiselect={false}
                        navHidden={false}
                        authImmediate={false}
                        query={"a query string like .txt or fileName"}
                        viewId={"PDFS"}
                    >
                        <Button variant="contained" size="small">
                            G-Drive
                        </Button>
                    </GooglePicker>{" "}
    
    
    export const googleDriveUpload = async (_, {fileID, authToken}) => {
      console.log(fileID, authToken);
      const drive = google.drive({version: 'v3', auth:authToken});
    
      var dest = fs.createWriteStream('/tmp/resume.pdf');
    
      drive.files.get({fileId: fileID, alt: 'media'}, 
      {responseType: 'stream'}, (err,  res ) => {
        if (err) {
          console.log("Error " ,err);
        } else {
            res.data.pipe(file);
            console.log("Download complete");
        }
      });