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>
60 lines
2.1 KiB
JavaScript
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);
|
|
}
|
|
});
|