Voici une recette pour authentifier une application Django avec une authentification OIDC générique (hors GAFAM par exemple, celle de la PLM par exemple…)
- Déclarer son application dans un service OIDC, positionner la bonne URL de callback et récupérer les Client_ID et le Secret généré suite ) la déclaration.
(dans cet exemple, l’url de callback sera : https://FQDN/accounts/oidc/my_oidc/login/callback/
)
-
Ajouter
django-allauth
dans le requirements.txt (en spécifiant une version, c’est mieux) -
configurer l’application :
settings.py
INSTALLED_APPS = [
'django.contrib.sites', # Obligatoire pour django-allauth
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.openid_connect', # Module OIDC
]
SITE_ID = 1 # Doit être défini pour allauth
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend', # Authentification classique
'allauth.account.auth_backends.AuthenticationBackend', # Authentification OIDC
]
LOGIN_REDIRECT_URL = '/' # Redirection après connexion
LOGOUT_REDIRECT_URL = '/' # Redirection après déconnexion
ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_DEFAULT_HTTP_PROTOCOL = 'https'
SOCIALACCOUNT_PROVIDERS = {
"openid_connect": {
"APPS": [{
"provider_id": "my_oidc", # Identifiant unique pour le provider
"name": "Mon Fournisseur OIDC",
"client_id": getenv('OIDC_CLIENT_ID', 'VOTRE_CLIENT_ID'),,
"secret": getenv('OIDC_SECRET', 'VOTRE_CLIENT_SECRET'),
"settings": {
"server_url": "https://plm.math.cnrs.fr",
"discovery_url": "https://plm.math.cnrs.fr/sp/.well-known/openid-configuration", # Discovery URL
},
}]
}
}
urls.py
from django.urls import path, include
urlpatterns = [
path('accounts/', include('allauth.urls')), # URLs de connexion OIDC
]
- réaliser la migration
python manage.py migrate
- Variables d’environnement
Positionner les variables des ID de connexion OIDC:
OIDC_CLIENT_ID
OIDC_SECRET
Cas particulier : sur Plmshift
Dans un environnement Kubernetes (PLMshift), nous sommes derrière plusieurs reverse proxy, il faut donc détecter le protocole HTTPS au niveau de gunicorn, pour cela il faut positionner la variable d’environnement au niveau du déploiement (Deployment):
FORWARDED_ALLOW_IPS="*"