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>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user