Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

Configuration du Projet Google

C'est la partie administrative obligatoire. Google ne permet la connexion que si le site est déclaré.

  1. Allez sur la Google Cloud Console.
  2. Créez un Nouveau Projet (Nommez-le "Ideo-Lab Login").
  3. Dans le menu, cherchez "Écran de consentement OAuth" :
    • SĂ©lectionnez Externe.
    • Remplissez les champs obligatoires (Nom app, Email support).
  4. Allez dans "Identifiants" > "+ CRÉER DES IDENTIFIANTS" > "ID Client OAuth".
  5. Type d'application : Application Web.
⚠ Point Critique : Les URLs AutorisĂ©es
Dans la section "Origines JavaScript autorisées", vous devez mettre exactement ces lignes :
  • http://localhost:8000 (Pour le dev local)
  • http://127.0.0.1:8000 (Pour le dev local)
  • https://www.ideo-lab.com (Pour la production)

Intégration HTML & JS

À insĂ©rer dans votre fichier login.html pour afficher le bouton et gĂ©rer le clic.

1. Le Code HTML (Bouton)

<!-- Script Google (Requis) -->
<script src="https://accounts.google.com/gsi/client" async defer></script>

<!-- Configuration du bouton (Invisible) -->
<div id="g_id_onload"
     data-client_id="VOTRE_CLIENT_ID_ICI.apps.googleusercontent.com"
     data-context="signin"
     data-ux_mode="popup"
     data-callback="handleCredentialResponse"
     data-auto_prompt="false">
</div>

<!-- Affichage visuel du bouton -->
<div class="g_id_signin"
     data-type="standard"
     data-shape="rectangular"
     data-theme="outline"
     data-text="signup_with"
     data-size="large"
     data-logo_alignment="left">
</div>

2. Le Script Javascript

Ce script intercepte la réponse de Google et l'envoie à votre serveur.

<script>
function handleCredentialResponse(response) {
    // Optionnel : Afficher un loader ici
    // document.getElementById('login-loader').style.display = 'block';

    // Envoi du token au backend Django
    fetch("/auth/google/", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ credential: response.credential })
    })
    .then(res => res.json())
    .then(data => {
        if (data.success) {
            window.location.href = "/home/"; 
        } else {
            alert("Erreur : " + data.message);
        }
    })
    .catch(e => {
        console.error(e);
        alert("Erreur de connexion serveur.");
    });
}
</script>

Code Python (Django)

Ce code reçoit le jeton, le valide, et crée la session utilisateur.

Librairie requise : Lancez pip install google-auth dans votre terminal.

Fichier : accounts/custom_login_views.py

import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import login, get_user_model
from google.oauth2 import id_token
from google.auth.transport import requests as google_requests

# REMPLACER PAR VOTRE VRAI ID CLIENT
GOOGLE_CLIENT_ID = "972885369398-XXXXX.apps.googleusercontent.com"

@csrf_exempt
def google_auth_receiver(request):
    if request.method == "POST":
        try:
            data = json.loads(request.body)
            token = data.get('credential')

            # 1. Validation Google
            idinfo = id_token.verify_oauth2_token(
                token, 
                google_requests.Request(), 
                GOOGLE_CLIENT_ID,
                clock_skew_in_seconds=10
            )

            # 2. Gestion User
            email = idinfo['email']
            User = get_user_model()
            
            try:
                user = User.objects.get(email=email)
            except User.DoesNotExist:
                user = User.objects.create(
                    username=email, 
                    email=email,
                    first_name=idinfo.get('given_name', ''),
                    last_name=idinfo.get('family_name', '')
                )
                user.set_unusable_password()
                user.save()

            if not user.is_active:
                return JsonResponse({'success': False, 'message': 'Compte désactivé'})

            # 3. FIX : Force Backend
            user.backend = 'django.contrib.auth.backends.ModelBackend'
            
            login(request, user)
            return JsonResponse({'success': True})

        except ValueError as e:
            return JsonResponse({'success': False, 'message': str(e)})
            
    return JsonResponse({'success': False})

ParamĂštres Django (Settings.py)

Configuration finale pour autoriser les popups sécurisés.

Sans cette ligne, la fenĂȘtre Google s'ouvrira mais restera blanche ou ne renverra rien.
# settings.py

# Nécessaire pour Google Sign-In (Cross-Origin-Opener-Policy)
SECURE_CROSS_ORIGIN_OPENER_POLICY = 'same-origin-allow-popups'

Urls.py

# urls.py
from django.urls import path
from . import custom_login_views

urlpatterns = [
    # ...
    path('auth/google/', custom_login_views.google_auth_receiver, name='google_auth_receiver'),
]