Implementer l'API
Choix d'implementation
spotify_sdk
Pour implémenter l'API il existe une librairie spotify_sdk. C'est une librairie flutter qui wrap les sdk natifs ios et android. Cette méthode est pratique à utiliser, mais pas facile à mettre en place car elle necessite de préparer l'utilisation de 2 API et entraine bien des complications de mise en place par rapport a la solution que nous allons utiliser.
HTTP
La solution que nous allons utiliser est bien plus general, formatrice et logique, elle consiste a utiliser l'API Web de Spotify en faisant des requetes HTTP.
Pour les requetes HTTP nous utiliserons un package Flutter fait pour, et la documentation de l'API est assez complete et disponible en ligne.
Mise en place
Planification
Voici le shema propose par la documentation de l'API montrant toutes les etapes entrant dans l'authentification :
Avancee de l'implementation
Etape 1
- get client id
- à créer et récup dans dashboard spotify
- set effective redirect uri
- attention à bien mettre une uri https
- à saisir sur dashboard
- trouver moyen de récupérer les données envoyées par Spotify sur l'uri, et de retourner sur l'appli
- generate state
- string aléatoire de 16 caractères à générer dans l'appli
- choose scopes
- déterminer nos besoins exact
- open login page in browser
- get code and state
Etape 2
- get client secret
- à créer et récup dans dashboard spotify
- get token things
Etape 3
...
Etape 4
...
App Linking
Presentation de l'outils
Une fois que nous sommes sur la page de connection de Spotify, l'API utilise la redirect_uri
(adresse web en https nous appartenant) que nous avons entree pour nous communiquer les attributs code
et state
qui seront necessaires pour les etapes suivantes. Une fois que nous sommes connecte nous sommes donc redirige dessus avec une requete.
Cette redirect_uri doit nous permettre de recuperer les 2 attributs, et que des que nous arrivons sur la page nous soyons redirige automatiquement sur l'appli.
Il existe 2 manieres de faire cela, le deep linking
et le app linking
. J'ai choisi le app linking car contrairement a l'autre il ne necessite jamais de devoir choisir quelque choise, c'est exactement ce que l'on veut.
Ressources utilisees
- Doc Flutter sur le Deep linking
- Doc pour le App linking
- Explication de la difference en app linking et deep linking
- Docmentation du plugin utilise
- Tuto youtube montrant une implentation
- Pour configurer le serveur apache
- Pour utiliser mkcert
Notes/etapes d'implementation
- Dans
android/app/src/main/AndroidManifest.xml
- ajouter le bout de code
App Links
fourni par le README du plugin - ajouter l'adresse de mon serveur
- ajouter la ligne
android:pathPrefix="/callback/"
pour indiquer le chemin que je veux
- ajouter le bout de code
- Creer un serveur web
- J'ai configure un serveur apache en local
- Comme l'adresse doit etre https et que je travaille en local, j'ai cree un CA et un certificat avec mkcert
- Je configure mon serveur apache pour autoriser ssl
- Il faut rendre mon certificat de confiance (CertPathValidatorException)
- Creer les fichiers web
- Dans le repertoire racine de notre page web (pour moi /callback/0, creer un repertoire
.well-known
- Dans ce repertoire creer un fichier
applinks.json
et ecrire le la configuration donnee par la doc app links- Remplacer le package_name par celui du manifest
- Remplacer le SHA 256 par celui du resultat de la requete, a executer dans le repertoire android
./gradlew signingReport
(cette commande de creer des "signatures" de notre application si elle n'a pas de Play App Signing, si elle en a un prefere keytool)- Il y a eu un probleme de build de mon cote, j'ai donc :
- Dans android/gradle/wrapper/gradle-wrapper.properties change le distributionUrl par .../gradle-6.7-all.zip
- Dans android/build.gradle dans la section buildscript { dependencies { change le classpath par ...gradle:4.1.0
- Penser à installer le paquet gradle pour que ça fonctionne
- Il y a eu un probleme de build de mon cote, j'ai donc :
- Dans le repertoire racine de notre page web (pour moi /callback/0, creer un repertoire
https://stackoverflow.com/questions/59911194/how-to-calculate-pckes-code-verifier/59913241#59913241
https://github.com/tobika/spotify-auth-PKCE-example/blob/main/public/main.js
Pb à régler :
partout la protection des méthodes et attributs
dans Spot un User plutot que juste un String idDafl
dans User séparer les rôles de la classe
dans Location enlever méthode getData static dans Location utiliser parse json plutot que traitement de string
currentTrack récupérable de plusieurs manières