friezer-85 / cas-oauth-laravel
A simple way to bridge an OAuth provider to a CAS-only application.
Installs: 10
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/friezer-85/cas-oauth-laravel
Requires
- laravel/framework: ^12.0
- socialiteproviders/manager: ^4.8
README
Un pont entre un fournisseur OAuth (Discord, Google, GitHub, etc.) et une application utilisant uniquement CAS pour l'authentification.
Ce package permet de transformer n'importe quel provider OAuth en serveur CAS, idéal pour connecter des applications legacy (comme Pronote, Moodle, etc.) à des systèmes d'authentification modernes.
📋 Table des matières
🔧 Prérequis
- PHP 8.2 ou supérieur
- Laravel 12.x
- Un serveur web (Apache/Nginx)
- Une application OAuth (Discord, Google, GitHub, etc.)
📦 Installation
1. Créer un nouveau projet Laravel
composer create-project laravel/laravel mon-serveur-cas
cd mon-serveur-cas
2. Installer le package
composer require friezer-85/cas-oauth-laravel
3. Installer un provider Socialite
Selon le provider OAuth que vous souhaitez utiliser :
Discord
composer require socialiteproviders/discord
GitHub
composer require socialiteproviders/github
composer require socialiteproviders/google
Autres providers
Voir la liste complète sur SocialiteProviders
⚙️ Configuration
1. Créer l'application OAuth
Pour Discord :
- Allez sur https://discord.com/developers/applications
- Cliquez sur "New Application"
- Donnez un nom à votre application
- Allez dans "OAuth2" → "General"
- Ajoutez l'URL de redirection :
(En production, remplacez par votre vrai domaine)http://cas.example.com/oauth/callback - Notez votre Client ID et Client Secret
Pour Google :
- Allez sur https://console.cloud.google.com/
- Créez un nouveau projet
- Activez "Google+ API"
- Allez dans "Credentials" → "Create Credentials" → "OAuth client ID"
- Ajoutez l'URL de redirection :
http://cas.example.com/oauth/callback - Notez votre Client ID et Client Secret
Pour GitHub :
- Allez sur https://github.com/settings/developers
- Cliquez sur "New OAuth App"
- Remplissez les informations :
- Homepage URL :
http://cas.example.com - Authorization callback URL :
http://cas.example.com/oauth/callback
- Homepage URL :
- Notez votre Client ID et Client Secret
2. Configuration du fichier .env
Ajoutez ces lignes à votre fichier .env :
# Provider OAuth à utiliser (discord, github, google, etc.) OAUTH_PROVIDER=discord # Credentials de votre application OAuth OAUTH_CLIENT_ID=votre_client_id_ici OAUTH_CLIENT_SECRET=votre_client_secret_ici # Scopes OAuth (séparés par des virgules ou espaces) # Discord : OAUTH_SCOPES=identify,email # Google : # OAUTH_SCOPES=openid,profile,email # GitHub : # OAUTH_SCOPES=user:email # Propriété utilisée pour générer le ticket CAS (défaut: id) CAS_PROPERTY=id # Paramètres OAuth personnalisés (optionnel) # Format: key=value,key2=value2 OAUTH_PARAMS=
3. Configuration des services autorisés
Éditez le fichier config/services.php et ajoutez :
<?php return [ /* |-------------------------------------------------------------------------- | CAS Services Configuration |-------------------------------------------------------------------------- | | Liste des URLs autorisées à utiliser le serveur CAS. | Utilisez des regex pour matcher les URLs. | IMPORTANT : Échappez les points avec \. | */ 'cas' => [ // Exemple : autoriser tout sur un domaine 'https://app1\.example\.com/(.*)', // Exemple : autoriser plusieurs domaines 'https://moodle\.example\.com/(.*)', 'https://app2\.example\.com/(.*)', // Pour le développement local 'http://localhost/(.*)', 'http://127\.0\.0\.1:8000/(.*)', ], ];
⚠️ Important : Les points . doivent être échappés avec \. dans les regex, sinon ils matchent n'importe quel caractère.
4. Lancer les migrations
php artisan migrate
Cette commande créera la table tickets nécessaire au fonctionnement du CAS.
Endpoints disponibles
1. Login CAS (Entrypoint)
GET /cas/login?service={RETURN_URL}
Exemple :
https://cas.example.com/cas/login?service=https://app.example.com/cas
Paramètres :
service(requis) : URL de redirection après authentificationrenew(optionnel) : Force une nouvelle authentification
2. Service Validate (Validation de ticket)
GET /cas/serviceValidate?service={URL}&ticket={TICKET}
Retourne une réponse XML avec les informations de l'utilisateur.
3. SAML Validate (Validation SAML)
POST /cas/samlValidate
Même chose que serviceValidate mais avec le format SAML.
Flow d'authentification complet
1. Application CAS → /cas/login?service=https://example.com
↓
2. Redirection vers Discord (ou autre provider)
↓
3. Utilisateur s'authentifie sur le provider
↓
4. Callback → /oauth/callback
↓
5. Génération du ticket CAS
↓
6. Redirection vers https://example.com?ticket=ST-xxx
↓
7. L'application valide le ticket via /cas/serviceValidate
↓
8. Réponse XML avec les infos utilisateur
Exemple de réponse XML
Après validation d'un ticket, vous recevrez une réponse XML de ce type :
<cas:serviceResponse xmlns:cas="http://www.yale.edu/tp/cas"> <cas:authenticationSuccess> <cas:user>123456789</cas:user> <cas:attributes> <cas:id>123456789</cas:id> <cas:nickname>username</cas:nickname> <cas:name>User Name</cas:name> <cas:email>user@example.com</cas:email> <cas:avatar>https://cdn.discordapp.com/avatars/...</cas:avatar> </cas:attributes> </cas:authenticationSuccess> </cas:serviceResponse>
🔌 Providers supportés
Ce package utilise Laravel Socialite et SocialiteProviders.
Providers testés
| Provider | Package | Scopes recommandés |
|---|---|---|
| Discord | socialiteproviders/discord |
identify email |
| GitHub | socialiteproviders/github |
user:email |
socialiteproviders/google |
openid,profile,email |
|
| Microsoft | socialiteproviders/microsoft |
openid,profile,email |
Ajouter un nouveau provider
- Installez le package Socialite correspondant
- Configurez
OAUTH_PROVIDERdans.env - Ajoutez les credentials dans
.env - Ajoutez les scopes appropriés
Exemple pour Microsoft :
composer require socialiteproviders/microsoft
OAUTH_PROVIDER=microsoft OAUTH_CLIENT_ID=votre_client_id OAUTH_CLIENT_SECRET=votre_client_secret OAUTH_SCOPES=openid,profile,email
🐛 Dépannage
Erreur 404 sur /cas/login
Cause : Les routes ne sont pas chargées
Solutions :
- Vérifiez que toutes les variables obligatoires sont dans
.env - Vérifiez que
config/services.phpcontient la clé'cas' - Clearez le cache :
php artisan config:clear php artisan route:clear php artisan cache:clear
- Vérifiez les routes chargées :
php artisan route:list | grep cas
Erreur "redirect_uri_mismatch"
Cause : L'URL de callback ne correspond pas à celle configurée dans votre application OAuth
Solution : Vérifiez que l'URL dans votre application OAuth est exactement :
http://cas.example.com/oauth/callback
Erreur "invalid_client"
Cause : Client ID ou Secret incorrect
Solution : Vérifiez vos credentials dans .env et dans votre application OAuth
Scope "1" au lieu des vrais scopes (Discord)
Cause : Scopes non déclarés
Solution : Déclarez au minimum le scope openid ou identify :
# ✅ BON
OAUTH_SCOPES=openid
Ticket invalide lors de la validation
Cause : Le ticket a expiré (10 secondes par défaut)
Solution : Les tickets CAS sont à usage unique et expirent rapidement. Assurez-vous que votre application valide le ticket immédiatement après l'avoir reçu.
Service non autorisé
Cause : L'URL du service n'est pas dans la liste des services autorisés
Solution : Ajoutez l'URL dans config/services.php avec la bonne regex :
'cas' => [ 'https://app\.example\.com/(.*)', ]
📝 Variables d'environnement
Obligatoires
| Variable | Description | Exemple |
|---|---|---|
OAUTH_PROVIDER |
Provider OAuth à utiliser | discord |
OAUTH_CLIENT_ID |
ID client OAuth | 123456789 |
OAUTH_CLIENT_SECRET |
Secret client OAuth | abcdef123456 |
Optionnelles
| Variable | Description | Défaut | Exemple |
|---|---|---|---|
CAS_PROPERTY |
Propriété utilisée pour le user CAS | id |
email |
OAUTH_SCOPES |
Scopes OAuth demandés | openid,profile,email |
identify email |
OAUTH_PARAMS |
Paramètres OAuth personnalisés | `` | prompt=consent |
🔒 Sécurité
- Les tickets CAS expirent après 10 secondes
- Les tickets sont à usage unique
- Les services doivent être explicitement autorisés dans
config/services.php - Utilisez HTTPS en production
- Ne commitez jamais votre
.envdans Git
📄 Licence
Ce projet est sous licence GNU General Public License v3.0.
⭐ Si ce projet vous a aidé, n'hésitez pas à lui donner une étoile sur GitHub !