0

J'essaie donc d'utiliser Google Drive pour obtenir la liste des ID de fichier, puis utiliser ces ID de fichier pour mettre à jour les feuilles de calcul via l'API Google Sheets.Autorisation pour l'API Google Drive et Google Sheets ensemble

J'ai du mal à comprendre comment exactement je devrais combiner ces authentifications dans Node.js afin de répondre aux deux besoins d'authentification.

Mon but est de créer une application Alexa qui met à jour des feuilles de calcul et j'ai en cours d'exécution et d'essayer de développer de cette application: https://github.com/acucciniello/alexa-open-doc

Parce que c'est Alexa Je suppose que je ne peux pas stocker quoi que ce soit sur le système de fichiers comme je peux localement si donc la raison pour laquelle je suis en train d'utiliser le jeton comme hardcoded que je généré par ma ligne de commande

Voilà ma tentative de combiner API Google Drive + Feuilles auth:

// authorize.js 
var GoogleAuth = require('google-auth-library') 

// Purpose: To set the credentials from the client_secret.json and  checks if the token is valid 
// param(in): credentials: Authentication information of user from  client_secret.json 
// param(in):  token: The access token received from the lambda  request and google 
// param(in): callback: A function that handles the error or returns  the authentication information 
module.exports = function authorize (credentials, token, callback) { 
    var clientSecret = credentials.web.client_secret 
    var clientId = credentials.web.client_id 
    var redirectUrl = credentials.web.redirect_uris[0] 
    var auth = new GoogleAuth() 
    var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl) 
    // Check if we have previously stored a token 
    oauth2Client.setCredentials({ 
    access_token: token, 
    }) 
    oauth2Client.credentials = "MY_COMMAND_LINE_TOKEN"; 
    if (token === undefined) { 
    var undefinedToken = 'Token is undefined, please link the skill' 
    return callback(undefinedToken) 
    } 
    return callback(null, oauth2Client) 
} 

Voici mon actuellement Travailler dans g Alexa + Google Drive Auth:

// authorize.js 
var GoogleAuth = require('google-auth-library') 

// Purpose: To set the credentials from the client_secret.json and checks if the token is valid 
// param(in): credentials: Authentication information of user from client_secret.json 
// param(in):  token: The access token received from the lambda request and google 
// param(in): callback: A function that handles the error or returns the authentication information 
module.exports = function authorize (credentials, token, callback) { 
    var clientSecret = credentials.web.client_secret 
    var clientId = credentials.web.client_id 
    var redirectUrl = credentials.web.redirect_uris[0] 
    var auth = new GoogleAuth() 
    var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl) 
    // Check if we have previously stored a token 
    oauth2Client.setCredentials({ 
    access_token: token 
    }) 
    if (token === undefined) { 
    var undefinedToken = 'Token is undefined, please link the skill' 
    return callback(undefinedToken) 
    } 
    return callback(null, oauth2Client) 
} 

Et mes feuilles Google Auth:

var fs = require('fs'); 
var readline = require('readline'); 
var google = require('googleapis'); 
var googleAuth = require('google-auth-library'); 

// If modifying these scopes, delete your previously saved credentials 
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json 
var SCOPES = ['https://www.googleapis.com/auth/spreadsheets']; 
var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH || 
    process.env.USERPROFILE) + '/.credentials/'; 
var TOKEN_PATH = TOKEN_DIR + 'sheets.googleapis.com-nodejs-quickstart.json'; 

// Load client secrets from a local file. 
fs.readFile('client_secret.json', function processClientSecrets(err, content) { 
    if (err) { 
    console.log('Error loading client secret file: ' + err); 
    return; 
    } 
    // Authorize a client with the loaded credentials, then call the 
    // Google Sheets API. 
    authorize(JSON.parse(content), listMajors); 
}); 

/** 
* 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) { 
    var clientSecret = credentials.installed.client_secret; 
    var clientId = credentials.installed.client_id; 
    var redirectUrl = credentials.installed.redirect_uris[0]; 
    var auth = new googleAuth(); 
    var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); 

    // Check if we have previously stored a token. 
    fs.readFile(TOKEN_PATH, function(err, token) { 
    if (err) { 
     getNewToken(oauth2Client, callback); 
    } else { 
     oauth2Client.credentials = JSON.parse(token); 
     callback(oauth2Client); 
    } 
    }); 
} 

/** 
* Get and store new token after prompting for user authorization, and then 
* execute the given callback with the authorized OAuth2 client. 
* 
* @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for. 
* @param {getEventsCallback} callback The callback to call with the authorized 
*  client. 
*/ 
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); 
    }); 
    }); 
} 

/** 
* Store token to disk be used in later program executions. 
* 
* @param {Object} token The token to store to disk. 
*/ 
function storeToken(token) { 
    try { 
    fs.mkdirSync(TOKEN_DIR); 
    } catch (err) { 
    if (err.code != 'EEXIST') { 
     throw err; 
    } 
    } 
    fs.writeFile(TOKEN_PATH, JSON.stringify(token)); 
    console.log('Token stored to ' + TOKEN_PATH); 
} 

Répondre

0

La seule différence est les champs d'application. Vous pouvez utiliser n'importe quel ensemble d'étendues, y compris Drive et Sheets dans le même appel pour autoriser. Regardez dans votre client_secret.json et ajustez les étendues ici.