6.1 KiB
Étape 2 — OAuth2 Intra + token unique
Prérequis : étape 1 OK (
swiftyCompanion/swifty_companion/créé,flutter runfonctionne).
Objectif de l’étape
- Obtenir un access token via OAuth2 de l’Intra (pas un token par requête API).
- Stocker les secrets dans
.env(racineswiftyCompanion/ou dossierswifty_companion/— un seul endroit, documenté dans le README). - Avoir un service d’auth réutilisable pour toutes les futures requêtes
api.intra.42.fr.
Les vues (recherche login, profil) viennent aux étapes 3–4 ; ici on pose l’authentification API.
2.1 — Vérifier l’app
cd ~/projets/42School/swifty_companion/swiftyCompanion/swifty_companion
flutter pub get
flutter run -d <device>
L’écran compteur par défaut suffit pour valider l’étape 1.
2.2 — Créer l’application OAuth sur l’Intra
- profile.intra.42.fr/oauth/applications → New application.
- Renseigner :
- Name : ex.
swifty_companion_dev - Website : URL factice ou repo perso (souvent requis)
- Redirect URI : doit correspondre exactement à ce que l’app utilisera (voir 2.3)
- Name : ex.
- Noter UID (=
CLIENT_ID) et SECRET (=CLIENT_SECRET).
Copier swiftyCompanion/.env.example → .env (même niveau que le README rendu ou dans swifty_companion/) :
CLIENT_ID=...
CLIENT_SECRET=...
REDIRECT_URI=...
2.3 — Choisir le REDIRECT_URI (mobile)
Erreur Intra : « must be a valid URI »
Le formulaire 42 Intra accepte en pratique surtout des URI http:// ou https://.
Les schémas du type com.example.swifty_companion://callback sont souvent refusés (validateur strict + _ dans le schéma).
Type d’application Intra : 42 pedagogic project (normal pour Swifty Companion — pas de type « mobile »).
URI de redirection — format http(s)://host:port/chemin uniquement (pas de com.example://…).
Essayer dans cet ordre (une seule ligne dans le champ, sans guillemets ni espace) :
http://localhost:8080/callback← le plus courant sur l’Intra 42http://localhost:3000/callbackhttp://127.0.0.1:8080/callback
Exemple tiré de la doc 42 :
http://localhost:1919/users/auth/ft/callback (tu peux t’en inspirer, mais garde une URI simple type /callback).
Copier exactement la ligne acceptée dans .env et dans Flutter.
Avec flutter_appauth, Android/iOS interceptent cette URL de boucle locale après le login dans le navigateur — pas besoin d’un vrai serveur web.
| Approche | Redirect URI | Intra 42 |
|---|---|---|
| Recommandé (Flutter + 42) | http://127.0.0.1:42800/callback |
✅ en général accepté |
| Schéma custom | com.example.swifty_companion://callback |
❌ souvent refusé |
| Site web classique | https://ton-domaine.com/callback |
✅ si tu as un backend |
Le même URI doit être : formulaire Intra, .env, et paramètre redirect_uri dans l’app.
Android : applicationId = com.example.swifty_companion (android/app/build.gradle.kts) — indépendant du REDIRECT_URI loopback.
Endpoints 42 (référence) :
| Étape | URL |
|---|---|
| Autorisation | GET https://api.intra.42.fr/oauth/authorize |
| Token | POST https://api.intra.42.fr/oauth/token |
| API | GET https://api.intra.42.fr/v2/... avec header Authorization: Bearer <token> |
Paramètres authorize usuels : client_id, redirect_uri, response_type=code, scope=public.
2.4 — Dépendances Flutter suggérées
Dans swifty_companion/ :
flutter pub add flutter_dotenv http
# selon le flux choisi, par ex. :
# flutter pub add flutter_appauth
| Package | Rôle |
|---|---|
flutter_dotenv |
Charger .env au démarrage |
http |
Échange code → token + appels API |
flutter_appauth |
Flux OAuth2 + redirect natif (optionnel mais pratique) |
2.5 — Architecture minimale (fichiers à créer)
lib/
├── main.dart # dotenv.load + MaterialApp
├── config/
│ └── env.dart # lecture CLIENT_ID, etc.
└── services/
└── intra_auth_service.dart # token en mémoire (singleton)
Règles sujet :
- Un seul token : le service le garde après le login OAuth ; les futures requêtes réutilisent
getAccessToken(). - Ne pas appeler
/oauth/tokenavant chaqueGET /v2/users/....
Pseudo-contrat du service :
class IntraAuthService {
String? _accessToken;
String? get accessToken => _accessToken;
bool get isAuthenticated => _accessToken != null;
Future<void> signIn(); // ouvre le flux OAuth, stocke le token
Future<String> getValidToken(); // retourne le token (bonus : refresh plus tard)
}
Test manuel étape 2 : bouton « Se connecter à l’Intra » → navigateur / WebView → retour app → afficher temporairement « Connecté » ou le login /v2/me.
2.6 — .env et assets
Si flutter_dotenv charge depuis la racine du package Flutter :
- Placer
.envdansswifty_companion/(ignoré par git). - Déclarer dans
pubspec.yaml:
flutter:
assets:
- .env
En production soutenance : les correcteurs créent leur
.envavec leur app OAuth ; ne jamais committer le fichier.
2.7 — Critère « terminé » pour l’étape 2
| Check | OK si |
|---|---|
| OAuth Intra | Connexion obtient un access token |
| Token unique | Plusieurs appels API utilisent le même token sans re-login |
| Secrets | Uniquement dans .env, pas dans le code en dur |
| Doc | README rendu rappelle où mettre .env et comment lancer l’app |
Ensuite — étape 3
→ etape-03-vue-recherche.md (à rédiger quand l’étape 2 est validée) : vue 1 — champ login, appel API, erreurs 404 / réseau.
Documentation API utile :
- apidoc
- User :
GET /v2/users/:idou recherche par login (voir doc)