Аутентификация API-интерфейса Google на Heroku с использованием NodeJS

Я следую этому примеру для доступа к API Google Таблиц:

https://developers.google.com/sheets/api/quickstart/nodejs

В примере кода используется следующий метод для получения нового маркера oauth.

function getNewToken(oauth2Client, callback) { var authUrl = oauth2Client.generateAuthUrl({ access_type: 'offline', scope: SCOPES }); console.log('Authorize this app by visiting this url: ', authUrl); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('Enter the code from that page here: ', function(code) { rl.close(); oauth2Client.getToken(code, function(err, token) { if (err) { console.log('Error while trying to retrieve access token', err); return; } oauth2Client.credentials = token; storeToken(token); callback(oauth2Client); }); }); } 

Это отлично работает на моей локальной машине (вручную просматривая страницу, как было предложено в терминале, и вводит код в командной строке). Но это кажется непрактичным и не работает на Heroku. Есть ли способ автоматизировать это? Может быть, выбирая URL (и токен) в приложении nodeJS и как-то сохраняя это?

Заранее спасибо.

Итак, я закончил использование ключа учетной записи службы, который можно создать на странице https://console.developers.google.com . Это создаст файл JSON, для которого вам понадобятся два значения: client_email и client_email .

Чтобы протестировать это локально, вы можете загрузить модуль dotenv npm, который позволит вам хранить переменные среды в файле .env в корне вашего проекта. Ваш .env файл будет выглядеть так:

 GOOGLE_PRIVATE_KEY= GOOGLE_CLIENT_EMAIL= 

Не забудьте добавить файл .env в свой .gitignore список при развертывании вашего приложения heroku через git.

Мой файл auth.js выглядит так:

 const GoogleAuth = require('google-auth-library'); const SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']; function authorize() { return new Promise(resolve => { const authFactory = new GoogleAuth(); const jwtClient = new authFactory.JWT( process.env.GOOGLE_CLIENT_EMAIL, null, process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'), SCOPES ); jwtClient.authorize(() => resolve(jwtClient)); }); } module.exports = { authorize, } 

Обратите внимание на функцию замены за переменной закрытого ключа.

Мой app.js (основной файл) выглядит следующим образом:

 require('dotenv').config(); const google = require('googleapis'); const sheetsApi = google.sheets('v4'); const googleAuth = require('./auth'); const SPREADSHEET_ID = 'Your-spreadsheet-ID'; googleAuth.authorize() .then((auth) => { sheetsApi.spreadsheets.values.get({ auth: auth, spreadsheetId: SPREADSHEET_ID, range: "'Tab Name'!A1:H300", }, function (err, response) { if (err) { console.log('The API returned an error: ' + err); return console.log(err); } var rows = response.values; console.log(null, rows); }); }) .catch((err) => { console.log('auth error', err); }); 

Если вы получите следующую ошибку:

The API returned an error: Error: The caller does not have permission

Поделитесь электронной таблицей, которую вы пытаетесь загрузить с помощью google_client_email, и повторите попытку.

Если все работает локально, добавьте переменные окружения в ваше приложение heroku, посетив вашу учетную запись heroku и перейдя к settings и нажмите « reveal config vars и разверните приложение. Если все идет хорошо, у вас должен быть доступ к документу.