Autentificando la API de Google Sheet en Heroku usando NodeJS

Estoy siguiendo este ejemplo para acceder a la API de Google Sheets:

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

Dentro del código de ejemplo, se encuentra el siguiente método para obtener un nuevo touth outh.

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); }); }); } 

Esto funciona bien en mi máquina local (visitando manualmente la página como se indica en el terminal e ingresando el código en la línea de comandos). Pero esto parece poco práctico y no funciona en Heroku. ¿Hay alguna forma de automatizar esto? ¿Tal vez obteniendo la URL (y el token) en la aplicación nodeJS y almacenando esto de alguna manera?

Gracias por adelantado.

Ok, así que terminé usando una clave de cuenta de servicio que se puede generar en https://console.developers.google.com . Esto generará un archivo JSON del cual necesita dos valores: client_email y client_email .

Para probar esto localmente, puede descargar el módulo dotenv npm que le permitirá almacenar las variables de entorno en un archivo .env en la raíz de su proyecto. Tu archivo .env se verá así:

 GOOGLE_PRIVATE_KEY= GOOGLE_CLIENT_EMAIL= 

No olvide agregar el archivo .env a su lista de .gitignore al implementar su aplicación heroku a través de git.

Mi archivo auth.js ve así:

 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, } 

Note la función de reemplazo detrás de la variable de clave privada.

Mi app.js (archivo principal) tiene este aspecto:

 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); }); 

Si obtiene el siguiente error:

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

Comparta la hoja de cálculo que está intentando cargar con google_client_email e intente nuevamente.

Si todo funciona de forma local, agregue las Variables de entorno a su aplicación heroku visitando su cuenta de heroku y accediendo a la settings haga clic en reveal config vars y despliegue la aplicación. Si todo va bien, deberías tener acceso al documento.