Fix: Résolution des problèmes OAuth Google Calendar

Corrections apportées :

1. **redirect_uri_mismatch** :
   - Ajout de la variable APP_URL dans .env.example avec documentation
   - Amélioration de la fonction getOAuth2Client pour accepter une URI personnalisée
   - Gestion plus flexible du redirect_uri (APP_URL ou localhost par défaut)

2. **Choix du compte Google** :
   - Modification du prompt OAuth : 'consent' → 'select_account consent'
   - Force maintenant l'affichage du sélecteur de compte Google

3. **Interface utilisateur** :
   - Ajout d'un encadré d'avertissement visible avec l'URL de redirection exacte
   - Instructions claires pour la configuration dans Google Cloud Console
   - Indication pour configurer APP_URL si nécessaire

4. **Documentation** :
   - Création du fichier OAUTH_SETUP.md avec guide complet
   - Checklist de vérification pour le débogage
   - Exemples de configuration pour local et production

Ces modifications permettent de résoudre l'erreur 400 redirect_uri_mismatch
et d'offrir le choix du compte Google lors de la connexion.
This commit is contained in:
Claude committed 2025-11-12 12:50:07 +00:00
1 parent 2307038ff0
commit 95eba6ce63
4 files changed
+123 -6

No files matched your search

+9 -4
View File
@@ -14,8 +14,9 @@ const SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'];
/**
* Créer un client OAuth2
* @param {string} [customRedirectUri] - URI de redirection personnalisée (optionnel)
*/
async function getOAuth2Client() {
async function getOAuth2Client(customRedirectUri = null) {
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'");
@@ -23,7 +24,9 @@ async function getOAuth2Client() {
throw new Error('Client ID et Client Secret non configurés');
}
const redirectUri = `${process.env.APP_URL || 'http://localhost:2222'}/api/calendar/oauth-callback`;
// Utiliser l'URI personnalisée si fournie, sinon utiliser APP_URL ou localhost
const redirectUri = customRedirectUri ||
`${process.env.APP_URL || 'http://localhost:2222'}/api/calendar/oauth-callback`;
return new google.auth.OAuth2(
clientId.value,
@@ -38,12 +41,14 @@ async function getOAuth2Client() {
*/
router.get('/auth-url', requireAdmin, async (req, res) => {
try {
const oauth2Client = await getOAuth2Client();
// Permettre de passer une URL de redirection personnalisée via query param
const customRedirectUri = req.query.redirect_uri;
const oauth2Client = await getOAuth2Client(customRedirectUri);
const authUrl = oauth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES,
prompt: 'consent', // Force le prompt pour obtenir refresh_token
prompt: 'select_account consent', // Force le choix du compte ET le prompt pour obtenir refresh_token
state: req.user.id.toString() // Pour identifier l'utilisateur au retour
});