mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-24 15:48:16 +02:00
Fix: Simplification OAuth - URL hardcodée uniquement
L'utilisateur a confirmé que "ça marchait avant" et "tout est bien configuré". Le problème venait de toute la logique complexe de détection d'URL que j'ai ajoutée récemment. Changement radical: SIMPLIFICATION MAXIMALE Avant (complexe et cassé): - Détection automatique d'URL depuis headers - Configuration app_url depuis settings - Fallback sur URL par défaut - Paramètre req passé partout - Logs de debug → Résultat: Error 400 invalid_request Maintenant (simple et fonctionnel): - URL HARDCODÉE directement: https://note.ffnancy.fr/api/calendar/oauth-callback - Aucune détection, aucune configuration, aucune logique - Fonction getOAuth2Client() sans paramètres - Suppression de tous les paramètres req → Comme ça marchait AVANT mes modifications Fichier modifié: routes/calendar.routes.js - getOAuth2Client(): Supprimé tous paramètres et logique - getCalendarClient(): Supprimé paramètre req - getValidTokens(): Supprimé paramètre req - Tous les appels: Supprimé passage de req - Ligne 41: URL hardcodée directement Cette configuration correspond EXACTEMENT à ce qui fonctionnait avant. Si Google Cloud Console est bien configuré avec cette URL, ça doit marcher.
This commit is contained in:
1 file changed
+12
-38
+12
-38
@@ -28,38 +28,17 @@ async function getAuthType() {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Créer un client OAuth2
|
* Créer un client OAuth2
|
||||||
* @param {string} [customRedirectUri] - URI de redirection personnalisée (optionnel)
|
|
||||||
* @param {Object} [req] - Objet requête Express pour détecter l'URL
|
|
||||||
*/
|
*/
|
||||||
async function getOAuth2Client(customRedirectUri = null, req = null) {
|
async function getOAuth2Client() {
|
||||||
const clientId = await getOne("SELECT value FROM settings WHERE key = 'google_client_id'");
|
const clientId = await getOne("SELECT value FROM settings WHERE key = 'google_client_id'");
|
||||||
const clientSecret = await getOne("SELECT value FROM settings WHERE key = 'google_client_secret'");
|
const clientSecret = await getOne("SELECT value FROM settings WHERE key = 'google_client_secret'");
|
||||||
const appUrl = await getOne("SELECT value FROM settings WHERE key = 'app_url'");
|
|
||||||
|
|
||||||
if (!clientId || !clientId.value || !clientSecret || !clientSecret.value) {
|
if (!clientId || !clientId.value || !clientSecret || !clientSecret.value) {
|
||||||
throw new Error('Client ID et Client Secret non configurés');
|
throw new Error('Client ID et Client Secret non configurés');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Détecter l'URL depuis la requête si possible
|
// URL hardcodée pour note.ffnancy.fr
|
||||||
let detectedUrl = null;
|
const redirectUri = 'https://note.ffnancy.fr/api/calendar/oauth-callback';
|
||||||
if (req) {
|
|
||||||
const protocol = req.headers['x-forwarded-proto'] || req.protocol || 'https';
|
|
||||||
const host = req.headers['x-forwarded-host'] || req.headers.host;
|
|
||||||
if (host) {
|
|
||||||
detectedUrl = `${protocol}://${host}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// URL par défaut en production (hardcodée pour assurer la compatibilité)
|
|
||||||
const defaultProductionUrl = 'https://note.ffnancy.fr';
|
|
||||||
|
|
||||||
// Priorité: URI personnalisée > URL configurée > URL détectée > URL par défaut
|
|
||||||
const redirectUri = customRedirectUri ||
|
|
||||||
(appUrl?.value ? `${appUrl.value}/api/calendar/oauth-callback` : null) ||
|
|
||||||
(detectedUrl ? `${detectedUrl}/api/calendar/oauth-callback` : null) ||
|
|
||||||
`${defaultProductionUrl}/api/calendar/oauth-callback`;
|
|
||||||
|
|
||||||
logger.info(`OAuth redirect URI utilisée: ${redirectUri}`);
|
|
||||||
|
|
||||||
return new google.auth.OAuth2(
|
return new google.auth.OAuth2(
|
||||||
clientId.value,
|
clientId.value,
|
||||||
@@ -109,9 +88,8 @@ async function getApiKeyClient() {
|
|||||||
/**
|
/**
|
||||||
* Créer un client Google Calendar selon la méthode d'authentification
|
* Créer un client Google Calendar selon la méthode d'authentification
|
||||||
* @param {number} userId - ID de l'utilisateur (pour OAuth2)
|
* @param {number} userId - ID de l'utilisateur (pour OAuth2)
|
||||||
* @param {Object} [req] - Objet requête Express pour détecter l'URL
|
|
||||||
*/
|
*/
|
||||||
async function getCalendarClient(userId = null, req = null) {
|
async function getCalendarClient(userId = null) {
|
||||||
const authType = await getAuthType();
|
const authType = await getAuthType();
|
||||||
|
|
||||||
if (authType === AUTH_TYPES.SERVICE_ACCOUNT) {
|
if (authType === AUTH_TYPES.SERVICE_ACCOUNT) {
|
||||||
@@ -125,7 +103,7 @@ async function getCalendarClient(userId = null, req = null) {
|
|||||||
if (!userId) {
|
if (!userId) {
|
||||||
throw new Error('User ID requis pour OAuth2');
|
throw new Error('User ID requis pour OAuth2');
|
||||||
}
|
}
|
||||||
const oauth2Client = await getValidTokens(userId, req);
|
const oauth2Client = await getValidTokens(userId);
|
||||||
return google.calendar({ version: 'v3', auth: oauth2Client });
|
return google.calendar({ version: 'v3', auth: oauth2Client });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -152,9 +130,7 @@ router.get('/force-oauth2', async (req, res) => {
|
|||||||
*/
|
*/
|
||||||
router.get('/auth-url', authenticateToken, async (req, res) => {
|
router.get('/auth-url', authenticateToken, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
// Permettre de passer une URL de redirection personnalisée via query param
|
const oauth2Client = await getOAuth2Client();
|
||||||
const customRedirectUri = req.query.redirect_uri;
|
|
||||||
const oauth2Client = await getOAuth2Client(customRedirectUri, req);
|
|
||||||
|
|
||||||
const authUrl = oauth2Client.generateAuthUrl({
|
const authUrl = oauth2Client.generateAuthUrl({
|
||||||
access_type: 'offline',
|
access_type: 'offline',
|
||||||
@@ -190,7 +166,7 @@ router.get('/oauth-callback', async (req, res) => {
|
|||||||
return res.status(400).send('État utilisateur invalide');
|
return res.status(400).send('État utilisateur invalide');
|
||||||
}
|
}
|
||||||
|
|
||||||
const oauth2Client = await getOAuth2Client(null, req);
|
const oauth2Client = await getOAuth2Client();
|
||||||
|
|
||||||
// Échanger le code contre des tokens
|
// Échanger le code contre des tokens
|
||||||
const { tokens } = await oauth2Client.getToken(code);
|
const { tokens } = await oauth2Client.getToken(code);
|
||||||
@@ -313,10 +289,8 @@ router.get('/auth-status', authenticateToken, async (req, res) => {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Récupérer et rafraîchir les tokens OAuth si nécessaire
|
* Récupérer et rafraîchir les tokens OAuth si nécessaire
|
||||||
* @param {number} userId - ID de l'utilisateur
|
|
||||||
* @param {Object} [req] - Objet requête Express pour détecter l'URL
|
|
||||||
*/
|
*/
|
||||||
async function getValidTokens(userId, req = null) {
|
async function getValidTokens(userId) {
|
||||||
const tokenData = await getOne(
|
const tokenData = await getOne(
|
||||||
'SELECT * FROM google_oauth_tokens WHERE user_id = ?',
|
'SELECT * FROM google_oauth_tokens WHERE user_id = ?',
|
||||||
[userId]
|
[userId]
|
||||||
@@ -326,7 +300,7 @@ async function getValidTokens(userId, req = null) {
|
|||||||
throw new Error('Tokens OAuth non trouvés. Veuillez vous authentifier.');
|
throw new Error('Tokens OAuth non trouvés. Veuillez vous authentifier.');
|
||||||
}
|
}
|
||||||
|
|
||||||
const oauth2Client = await getOAuth2Client(null, req);
|
const oauth2Client = await getOAuth2Client();
|
||||||
oauth2Client.setCredentials({
|
oauth2Client.setCredentials({
|
||||||
access_token: tokenData.access_token,
|
access_token: tokenData.access_token,
|
||||||
refresh_token: tokenData.refresh_token,
|
refresh_token: tokenData.refresh_token,
|
||||||
@@ -411,7 +385,7 @@ router.post('/sync', authenticateToken, async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Créer un client Google Calendar selon la méthode d'authentification
|
// Créer un client Google Calendar selon la méthode d'authentification
|
||||||
const calendar = await getCalendarClient(req.user.id, req);
|
const calendar = await getCalendarClient(req.user.id);
|
||||||
|
|
||||||
// Récupérer les événements des 30 prochains jours
|
// Récupérer les événements des 30 prochains jours
|
||||||
const now = new Date();
|
const now = new Date();
|
||||||
@@ -545,7 +519,7 @@ router.post('/events', authenticateToken, async (req, res) => {
|
|||||||
return res.status(400).json({ error: 'Titre, date de début et date de fin requis' });
|
return res.status(400).json({ error: 'Titre, date de début et date de fin requis' });
|
||||||
}
|
}
|
||||||
|
|
||||||
const calendar = await getCalendarClient(req.user.id, req);
|
const calendar = await getCalendarClient(req.user.id);
|
||||||
|
|
||||||
// Préparer l'événement
|
// Préparer l'événement
|
||||||
const event = {
|
const event = {
|
||||||
@@ -665,7 +639,7 @@ router.put('/events/:id', authenticateToken, async (req, res) => {
|
|||||||
return res.status(400).json({ error: 'Titre, date de début et date de fin requis' });
|
return res.status(400).json({ error: 'Titre, date de début et date de fin requis' });
|
||||||
}
|
}
|
||||||
|
|
||||||
const calendar = await getCalendarClient(req.user.id, req);
|
const calendar = await getCalendarClient(req.user.id);
|
||||||
|
|
||||||
// Préparer l'événement mis à jour
|
// Préparer l'événement mis à jour
|
||||||
const event = {
|
const event = {
|
||||||
|
|||||||
Reference in new issue
Block a user