/** * Utilidad de un solo uso para obtener un refresh token de OAuth2 para la * cuenta personal de Google dueña de la carpeta de Drive (necesario porque * las Service Accounts no tienen cuota de almacenamiento en Drive personal). * * Uso: * node get-refresh-token.js * * 1. Imprime una URL de autorización. * 2. Ábrela en un navegador (donde sea, no tiene que ser este servidor), * inicia sesión con la cuenta de Google dueña de la carpeta y autoriza. * 3. El navegador redirige a una URL rota tipo http://localhost/?code=XXXX * (dará error de conexión, es normal). Copia el valor de "code" de la * barra de direcciones. * 4. Pega el código aquí cuando el script lo pida. * 5. El script imprime el refresh_token — guárdalo en GOOGLE_OAUTH_REFRESH_TOKEN. */ 'use strict'; const readline = require('readline'); const { google } = require('googleapis'); const [, , CLIENT_ID, CLIENT_SECRET] = process.argv; if (!CLIENT_ID || !CLIENT_SECRET) { console.error('Uso: node get-refresh-token.js '); process.exit(1); } const REDIRECT_URI = 'http://localhost'; const oauth2Client = new google.auth.OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URI); const authUrl = oauth2Client.generateAuthUrl({ access_type: 'offline', prompt: 'consent', scope: ['https://www.googleapis.com/auth/drive'] }); console.log('\n1. Abre esta URL en un navegador (con la cuenta de Google dueña de la carpeta):\n'); console.log(authUrl); console.log('\n2. Autoriza. Te redirigirá a una URL rota (http://localhost/?code=...) — está bien.'); console.log('3. Copia el valor de "code" de esa URL y pégalo abajo.\n'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.question('Código: ', async (code) => { rl.close(); try { const { tokens } = await oauth2Client.getToken(code.trim()); console.log('\n✅ Refresh token obtenido:\n'); console.log(tokens.refresh_token); console.log('\nGuárdalo como GOOGLE_OAUTH_REFRESH_TOKEN.\n'); } catch (err) { console.error('\n❌ Error al intercambiar el código:', err.message); process.exit(1); } });