Files
web/photo-upload/get-refresh-token.js
T
carlitosbondandClaude Sonnet 5 6ee4022d21 Add fotos.carloselugo.com photo-upload service
Event photo upload app with OAuth2 (Google Drive), Caddy route, and
env-var-driven compose config. Refresh token persists to token.json
so re-auth isn't needed after container restarts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-22 23:24:00 +00:00

60 lines
2.1 KiB
JavaScript

/**
* 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 <CLIENT_ID> <CLIENT_SECRET>
*
* 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 <CLIENT_ID> <CLIENT_SECRET>');
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);
}
});