при использовании oAuth2 отсутствует ключ API для листов Google - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь использовать API листов Google с oAuth2 в приложении express. Я выполнил базовую настройку c для чтения данных с листа, но когда я делаю запрос, я получаю сообщение об ошибке, что мне не хватает ключа API в ответе.

Насколько я могу сказать, что я проверяю, нужен ли токен с помощью функции authorize () и, если он уже существует, передает его в запросе. Так как токен должен аутентифицировать запрос, почему я получаю эту ошибку?

* Я также уже разрешил доступ к API через мою учетную запись

проверка токена авторизации

/**
 * Create an OAuth2 client with the given credentials, and then execute the
 * given callback function.
 * @param {Object} credentials The authorization client credentials.
 * @param {function} callback The callback to call with the authorized client.
 */
function authorize(credentials, callback) {
  const {client_secret, client_id, redirect_uris} = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
      client_id, client_secret, redirect_uris[0]);

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getNewToken(oAuth2Client, callback);
    oAuth2Client.setCredentials(JSON.parse(token));
    callback(oAuth2Client);
  });
}

звонит, чтобы получить данные листа

async function grabSheetData () {
  const authClient = await authorize(creds, ()=>{console.log('success')}); 

  const request = {
    spreadsheetId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
    range: 'A1:C2',
    valueRenderOption: 'ValueRenderOption.FORMATTED_VALUE',  
    dateTimeRenderOption: '[DateTimeRenderOption.SERIAL_NUMBER]',  
    auth: authClient, //this should be my token
  }

  try {
    const response = (await sheets.spreadsheets.values.get(request)).data;
    // TODO: Change code below to process the `response` object:
    console.log(JSON.stringify(response, null, 2));
  } catch (err) {
    console.error(err);
  }
};

grabSheetData();

1 Ответ

1 голос
/ 18 марта 2020
  • Вы хотите использовать Sheets API с помощью токена доступа, полученного с помощью OAuth2.
  • Вы хотите добиться этого с помощью googleapis с Node.js.
  • Вы уже смогли получить токен доступа для использования Sheets API.

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

Точки модификации:

  • В вашем сценарии я думаю, что authClient возвращает undefined. Потому что authorize не имеет возвращаемых значений.
    • Я думаю, что это является причиной вашей проблемы в вашем вопросе.
  • Кроме того, я думаю, что когда возвращается правильный authClient, возникает ошибка в sheets.spreadsheets.values.get(request). Поскольку значения valueRenderOption: 'ValueRenderOption.FORMATTED_VALUE' и dateTimeRenderOption: '[DateTimeRenderOption.SERIAL_NUMBER]' не верны.

Когда вышеуказанные точки отражаются в вашем сценарии, он становится следующим:

Измененный сценарий:

authorize:

В этой модификации я изменил ваш скрипт без изменения функции getNewToken().

function authorize(credentials) {
  return new Promise(resolve => {  // Added
    const { client_secret, client_id, redirect_uris } = credentials.installed;
    const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);

    // Check if we have previously stored a token.
    fs.readFile(TOKEN_PATH, (err, token) => {
      if (err) return getNewToken(oAuth2Client, e => resolve(e));  // Modified
      oAuth2Client.setCredentials(JSON.parse(token));
      resolve(oAuth2Client);  // Modified
    });
  });
}

grabSheetData:

async function grabSheetData() {
  const authClient = await authorize(creds);  // Modified

  const request = {
    spreadsheetId: 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 
    range: "A1:C2",
    valueRenderOption: "FORMATTED_VALUE",  // Modified
    dateTimeRenderOption: "SERIAL_NUMBER",  // Modified
    auth: authClient //this should be my token
  };

  try {
    const response = (await sheets.spreadsheets.values.get(request)).data;
    // TODO: Change code below to process the `response` object:
    console.log(JSON.stringify(response, null, 2));
  } catch (err) {
    console.error(err);
  }
}

grabSheetData();

Примечание:

  • В этой модификации предполагается, что creds и sheets уже были объявлены в другом месте. Пожалуйста, будьте осторожны с этим.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, в котором вы хотите, прошу прощения.

...