đ” SwipeZ API
API .NET 8 permettant dâauthentifier un utilisateur via Spotify OAuth2 PKCE, de rĂ©cupĂ©rer ses playlists, de gĂ©rer ses prĂ©fĂ©rences et de stocker/cache les donnĂ©es utilisĂ©es par lâapplication mobile SwipeZ.
đ Introduction
SwipeZ est une application mobile qui simplifie la gestion des playlists musicales en offrant une expérience intuitive pour conserver ou supprimer des morceaux par un simple swipe.
LâAPI que vous consultez ici fournit toutes les fonctionnalitĂ©s serveur nĂ©cessaires Ă lâapplication : authentification sĂ©curisĂ©e avec Spotify, rĂ©cupĂ©ration des playlists, gestion de sessions et cache.
- API GitHub : https://github.com/S5-C1-Exodia/webservice
- Application mobile : https://github.com/S5-C1-Exodia/mobile_app
đ„ Ăquipe
Martin LEMOIGNE âą Maxime CHARLET âą Guilhem BARRIQUAND âą Mathis DE SOUSA âą Victor LESUEUR âą Maxence TEIXEIRA
đïž Architecture gĂ©nĂ©rale
Schéma global
!
- Lâapplication Flutter se connecte Ă Spotify pour authentifier lâutilisateur via OAuth2 PKCE.
- LâAPI reçoit les jetons, crĂ©e une session sĂ©curisĂ©e et stocke les informations en base.
- Les playlists de lâutilisateur sont mises en cache pour rĂ©duire les appels Ă lâAPI Spotify.
- Lâutilisateur peut ensuite sĂ©lectionner, modifier ou vider ses prĂ©fĂ©rences de playlists.
Modules principaux
- Authentification PKCE OAuth2 : dĂ©marre lâautorisation Spotify, gĂšre le retour
callback, stocke refresh/access tokens. - Sessions & sécurité : gestion du cycle de vie via
APPSESSION, purge au logout, denylist des refresh tokens. - Gestion des playlists : import par pages (
PLAYLISTCACHE), lien session/cache (PLAYLISTCACHE_SESSION), sélection personnalisée (PLAYLISTSELECTION). - Logs & suivi :
AUDITLOGenregistre les actions clés pour audit et débogage.
âïž Installation & exĂ©cution locale
Prérequis
- .NET 8 SDK
- MySQL 8.4+
- Visual Studio 2022 ou VS Code
Cloner le projet
git clone https://github.com/S5-C1-Exodia/webservice.git
cd webservice/API
Configuration
Renommer ou compléter appsettings.json à partir de appsettings.Development.json :
{
"ConnectionStrings": {
"Default": "Server=localhost;Port=3306;Database=swipezdb;Uid=root;Pwd=;"
},
"Spotify": {
"ClientId": "<votre_client_id>",
"RedirectUri": "https://<votre_ngrok_ou_domaine>/api/spotify/callback",
"AuthorizeEndpoint": "https://accounts.spotify.com/authorize",
"TokenEndpoint": "https://accounts.spotify.com/api/token",
"BaseUrl": "https://api.spotify.com/v1",
"PlaylistsPageSize": 50
},
"Deeplink": {
"SchemeHost": "swipez://oauth-callback/spotify"
},
"Security": {
"PkceTtlMinutes": 10,
"SessionTtlMinutes": 60
}
}
Variables clés :
| Clé | Description |
|---|---|
ConnectionStrings.Default |
Connexion MySQL |
Spotify.ClientId |
Clé fournie par Spotify Developers |
Spotify.RedirectUri |
URL de callback OAuth Spotify |
Deeplink.SchemeHost |
Lien profond pour ouvrir lâapplication mobile |
Security.PkceTtlMinutes |
Durée de validité du challenge PKCE |
Security.SessionTtlMinutes |
Durée de vie des sessions |
Lancer lâAPI
dotnet restore
dotnet run
Par dĂ©faut lâAPI dĂ©marre sur https://localhost:5001 (ou un port libre selon ta config).
đ DĂ©ploiement (structure)
(Section à compléter lors de la mise en production)
- Reverse proxy (Caddy / Nginx)
- HTTPS (certificats Letâs Encrypt)
- Dockerfile / CI-CD (GitHub Actions, pipelines)
- Variables secrÚtes gérées via environnement
- Logs & monitoring (AuditLog)
đïž Base de donnĂ©es
LâAPI sâappuie sur MySQL 8.4 et la base swipezdb.
Chaque table et sa fonction sont dĂ©crites dans đïž Base de donnĂ©es SwipeZ.
Résumé rapide :
APPSESSION: sessions utilisateurTOKENSET: jetons OAuth long termeACCESSTOKEN: jeton dâaccĂšs Spotify en coursPLAYLISTCACHE&PLAYLISTCACHE_SESSION: cache des playlists et lien par sessionPLAYLISTSELECTION: playlists choisiesUSERPROFILECACHE: profil utilisateur SpotifyPKCEENTRY&DENYLISTEDREFRESH: sĂ©curitĂ© OAuthAUDITLOG: traçabilitĂ©
đ Endpoints de lâAPI
1ïžâŁ Authentification
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /api/spotify/auth/start |
DĂ©marre le flux OAuth2 PKCE et retourne lâURL Spotify + state. |
| GET | /api/spotify/callback |
Callback Spotify : Ă©change code â tokens, crĂ©ation session, redirection vers deeplink. |
| POST | /api/spotify/logout |
DĂ©connecte lâutilisateur et purge la session. |
Exemple â Start Auth
POST /api/spotify/auth/start
Content-Type: application/json
{
"scopes": ["playlist-read-private", "playlist-modify-private"]
}
Réponse :
{
"authorizationUrl": "https://accounts.spotify.com/authorize?...",
"state": "a1b2c3d4"
}
2ïžâŁ Playlists
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/spotify/playlists |
RécupÚre les playlists (pagination via X-Page-Token). |
| GET | /api/spotify/playlist-preferences |
Liste les playlists sélectionnées. |
| GET | /api/playlists/{playlist_id}/tracks |
Liste les playlists sélectionnées. |
| PUT | /api/spotify/playlist-preferences |
Remplace complÚtement la sélection de playlists. |
| PATCH | /api/spotify/playlist-preferences/add |
Ajoute des playlists à la sélection. |
| PATCH | /api/spotify/playlist-preferences/remove |
Retire des playlists de la sélection. |
| DELETE | /api/spotify/playlist-preferences |
Supprime toutes les préférences. |
Exemple â RĂ©cupĂ©ration playlists
GET /api/spotify/playlists
X-Session-Id: 9c92a6e3-2ed1-41e3-bb64-5db26cfb5f3f
Réponse :
{
"items": [
{
"playlistId": "37i9dQZF1DXcBWIGoYBM5M",
"name": "Today's Top Hits",
"owner": { "displayName": "Spotify" },
"images": [{ "url": "https://i.scdn.co/image/..." }],
"tracksCount": 50
}
],
"nextPageToken": "abc123"
}
Exemple â Modifier prĂ©fĂ©rences
PUT /api/spotify/playlist-preferences
X-Session-Id: 9c92a6e3-2ed1-41e3-bb64-5db26cfb5f3f
Content-Type: application/json
{
"playlistIds": ["37i9dQZF1DXcBWIGoYBM5M"]
}
Réponse : 204 No Content
đ SĂ©curitĂ©
- OAuth2 PKCE : génération
code_verifier&code_challenge, validationstate, Ă©change code â tokens. - Sessions : créées Ă chaque callback, TTL configurable (60 min par dĂ©faut).
- Refresh token denylist : empĂȘche la rĂ©utilisation aprĂšs logout.
- Audit & logs : toutes les actions critiques sont inscrites dans
AUDITLOG. - HTTPS recommandé pour toute utilisation en production.
â Tests
- Frameworks : xUnit, Moq pour mocks.
- Tests unitaires : sur Helpers, Managers, Services.
- Tests dâintĂ©gration : scripts Python (connexion, dĂ©connexion, playlists).
- Lancer les tests :
dotnet test
Pour les tests dâintĂ©gration Python :
cd Tests/Integration
pip install -r requirements.txt
python connexion.py
đ€ Contribution
- Forkez le repo puis créez une branche :
git checkout -b feature/ma-feature - Commit conventionnel (ex.
feat(auth): ajout dâun endpoint refresh token) - Pull request vers la branche
main - Tests Ă jour avant tout merge
đ Licence
(Ă insĂ©rer â ex. MIT adaptĂ© projet scolaire, ou mention IUT Dijon propriĂ©taire pĂ©dagogique)