Authentification aux EFS et EMS privés
leodarengosse opened this issue · 30 comments
J'ai découvert lors d'un atelier plugin avec la MAMP qu'il était possible d'ajouter à la carte les services Esri soumis à une authentification dans QGIS.
Pour cela, il faut configurer dans les paramètres de QGIS / authentification une entrée d'authentification OAuth2 (cf. capture ci-dessous).
La question est donc de savoir s'il est possible de récupérer dans QGIS le token d'authentification pour l'ajouter à la requête qui demande l'ajout du service à la carte.
Cela nous permettrait de gérer dans le plugin QGIS l'ajout des services privés et qu'il soit acheté par la MAMP au passage.
Pour le moment ça ne fonctionne pas sur mon poste mais on est censé pouvoir y arriver avec nos comptes Presta @SimonSAMPERE. J'organiserai un atelier spécifique sur le paramétrage dans nos QGIS pour qu'on puisse tester.
J'ai trouvé la doc officielle et j'ai essayé de le mettre en place avec notre portal mais j'ai constaté le même problème qu'à la MAMP au moment de me connecter au serveur.
Voici ma config qgis_portal.zip
@leodarengosse c'est une bonne chose que ça soit gérable en théorie, si on arrive à le configurer en interne je pourrai faire des tests, voir si c'est techniquement réalisable et envisager un chiffrage. En tous cas ça ne sera pas anodin comme fonctionnalité étant donné le code impliqué.
- checker pour Geoserver même si ya pas chez client ça pourrait être l'occas de faire d'une pierre 2 coups
Le problème constaté dans mon précédent commentaire est surement du au fait que IIS est installé sur mon Poste. En effet, lorsqu'on appelle l'IP 127.0.0.1 cela ouvre la page d'accueil de IIS
alors que sur sur un ordinateur qui n'a jamais activé IIS on obtient
J'ai testé sur l'ordinateur EGIS de Carlo vierge de iis et cela fonctionne
Du coup j'ai désactivé IIS sur mon poste en lancant la commande powershel indiquée dans cet article https://learn.microsoft.com/en-us/answers/questions/40665/how-to-uninstall-disable-iis-on-windows-10 mais ça ne fonctionne toujours pas.
J'ai vidé mon cache et redémarré mon ordi. Je n'ai plus la page d'accueil IIS quand je lance http://127.0.0.1/ mais cela ne fonctionne toujours pas quand je m'authentifie au portail Esri
Je suis bloqué à ce niveau
- https://docs.qgis.org/3.34/en/docs/pyqgis_developer_cookbook/authentication.html
- https://docs.qgis.org/3.34/en/docs/pyqgis_developer_cookbook/authentication.html#leave-authcfg-expansion-to-qgsauthmanager
- https://docs.qgis.org/3.34/en/docs/pyqgis_developer_cookbook/authentication.html#adapt-plugins-to-use-authentication-infrastructure
- https://qgis.org/pyqgis/master/core/QgsArcGisRestUtils.html
- https://qgis.org/pyqgis/3.22/core/QgsAuthManager.html
- https://gis.stackexchange.com/questions/354446/create-oauth2-authentication-in-pyqgis
Il faudrait déjà réussir avec un script Python à ajouter une couche de services privé ESRI auquel l'authentification a été configurée dans QGIS.
Il semble y avoir un problème avec l'outil de débogage/développement (Debugging/Development Tools), si la case "Désactiver le cache" n'est pas cochée, l'ajout de couches de services ESRI Privé depuis le plugin QGIS ne fonctionne pas. J'ai ouvert un ticket à ce sujet : qgis/QGIS#57588 --> résolu en vidant le cache du QgsNetworkAccessManager
avec QgsNetworkAccessManager.instance().cache().clear()
avant la création du QgsVectorLayer
(qgis/QGIS#57588 (comment))
Quoiqu'il en soit, la faisabilité technique semble établie avec les EFS privés Isogeo. En revanche pour les EMS ça ne fonctionne pas (peut-être à cause de qgis/QGIS#55067 , sinon créer un autre ticket). --> en fait ça marche aussi (à force d'être un crack tout fini par marcher)
Il faudra fouiller dans les QSettings pour récupérer les différentes connexions OAuth2 utilisées pour se connecter à un serveur ESRI. Donc dans connexion/argisfeatureserver/items
on trouve la liste des connexions à des ArcGIS Server sous forme de sous-dossiers contenant notamment :
- l'URL du serveur
connexion/argisfeatureserver/items/<nom>/url
- l'identifiant de la connexion utilisée pour s'y connecter
connexion/argisfeatureserver/items/<nom>/authcfg
Il faudrait donc extraire des QSettings ces infos pour pouvoir déterminer, au moment où l'utilisateur souhaite ajouter une couche de services EFS ou EMS, si on a un authcfg
qui correspond à l'URL du service et qui pourra être utilisé pour que le plugin QGIS interagisse avec.
Le SettingsManager
sera en charge d'extraire ces infos des QSettings et de les rendre disponibles au GeoServiceManager
et éventuellement au LayerAdder
. A priori, pas besoin de passer l'info au LayerAdder
, le GeoServiceManager
pourra se charger d'ajouter le paramètre authcfg
à l'URL de la couche.
La faisabilité technique n'est pas 100% établie selon moi, mais je ferai un premier chiffrage approximatif à 8 jours de travaille. Sans compter d'éventuelles échanges avec les futurs utilisateurs de la MAMP pour valider leur expérience.
@leodarengosse suite à mes derniers tests, j'ai pu établir la faisabilité technique pour les EMS et les EFS avec le service Isogeo.
Faut-il également faire des tests avec les WMS et WFS issus d'ArcGIS Server ?
la branche 3.6.0
a été créée et contient notamment les modifications du code source effectuées au cours du chiffrage
Faut-il également faire des tests avec les WMS et WFS issus d'ArcGIS Server ?
oui mais ce n'est pas prioritaire
sinon où en es-tu dans le chiffrage ?
Toujours 8 jours @leodarengosse
SPET
Ajouter dans le SettingsManager
la récupération des connexions enregistrées dans connexion/arcgisfeatureserver/items/<nom>/authcfg
. Attention, le folder connnexion
peut changer de nom selon la langue de QGIS. Stocker dans une propriété du SettingsManager
authcfg
et url
de chaque connexion :
afs_connections = {
"connection_name" : {
"url": "service_url",
"authcfg": "authcfg_id"
}
}
Dans la méthode check_esri_service
du GeoServiceManager
, récupérer l'info dans le SettingsManager
de s'il existe une connexion ArcGISFeatureServer pour le service testé. Si elle existe, faire la requête GetCapabilitites avec le bout de code suivant :
qnam = QgsNetworkAccessManager.instance()
request = QNetworkRequest(QUrl(service_dict["getCap_url"]))
reply = qnam.blockingGet(request, "authcfg_id")
reply_content_str = reply.content().data().decode("utf8")
reply_content_json = json.loads(reply_content_str)
getCap_content = reply_content_json
service_dict["reachable"] = 1
del qnam
Toujours dans la méthode check_esri_service
du GeoServiceManager
, si la requête GetCapabilitites a fonctionné en utilisant le authcfg
, stocker l'info dans le service_dict
.
Dans les méthodes build_efs_url
et build_ems_url
du GeoServiceManager
, récupérer l'info dans le service_dict
et ajouter le paramètre authcfg
à l'URL. De cette manière yaura potentiellement rien à gérer côté LayerAdder à part le vidage du cache avec QgsNetworkAccessManager.instance().cache().clear()
Comportement actuellement développé :
Le plugin QGIS inspecte toutes les connexions à des Serveurs ArcGIS REST et garde en mémoire, pour les connexions qui ont une Authentification configurée :
- nom de la connexion
- url
- identifiant de l'authentification
Au moment d'ajouter une couche de service, le plugin cherche dans les connexions gardées en mémoire s'il y en a une configurée pour une URL qui correspond à celle du service dont on veut ajouter une couche, si c'est le cas, il récupère l'identifiant de l'authentification et s'en sert pour requêter le service.
@leodarengosse je pense que tu peux déjà recetter ce comportement, avec une authentification OAuth2 différente si possible.
Les SPEFS sont dans ce commentaire
Si le comportement te semble satisfaisant, on pourra ensuite lancer des échanges avec la MAMP et leur envoyer une version bêta pour qu'ils puissent tester et valider que ça répond à leurs besoins.
@leodarengosse, voici la version à installer pour faire le test :
isogeo_search_engine.zip
Possibilité de contacter directement Céline de la MAMP pour organiser un test avec elle
@leodarengosse le zip de mon précédent commentaire semble effectivement incorrecte, essaye avec celui-ci :
isogeo_search_engine.zip
Il faut chercher ici monsieur @SimonSAMPERE
('qgis/connections-arcgisfeatureserver/ArcGIS Server Test Groupe de '
'couche/referer')
'qgis/connections-arcgisfeatureserver/ArcGIS Server Test Groupe de couche/url'
'qgis/connections-arcgisfeatureserver/Copernicus/referer'
'qgis/connections-arcgisfeatureserver/Copernicus/url'
'qgis/connections-arcgisfeatureserver/EMS_EFS_WMS_WFS/referer'
'qgis/connections-arcgisfeatureserver/EMS_EFS_WMS_WFS/url'
'qgis/connections-arcgisfeatureserver/GeoAtlas MAMP/community_endpoint'
'qgis/connections-arcgisfeatureserver/GeoAtlas MAMP/content_endpoint'
'qgis/connections-arcgisfeatureserver/GeoAtlas MAMP/url'
'qgis/connections-arcgisfeatureserver/Isogeo Test - EFS/referer'
'qgis/connections-arcgisfeatureserver/Isogeo Test - EFS/url'
'qgis/connections-arcgisfeatureserver/Isogeo Test - EMS (Groups)/referer'
'qgis/connections-arcgisfeatureserver/Isogeo Test - EMS (Groups)/url'
'qgis/connections-arcgisfeatureserver/Isogeo Test - EMS/referer'
'qgis/connections-arcgisfeatureserver/Isogeo Test - EMS/url'
'qgis/connections-arcgisfeatureserver/Isogeo Test Prive - EMS/referer'
'qgis/connections-arcgisfeatureserver/Isogeo Test Prive - EMS/url'
'qgis/connections-arcgisfeatureserver/Portal Esri Isogeo/referer'
'qgis/connections-arcgisfeatureserver/Portal Esri Isogeo/url'
'qgis/connections-arcgisfeatureserver/Scan Service - EFS /referer'
'qgis/connections-arcgisfeatureserver/Scan Service - EFS /url'
'qgis/connections-arcgisfeatureserver/selected'
'qgis/connections-arcgismapserver/selected'
'done'
@leodarengosse peux-tu réessayer avec la version ci-dessous stp ?
isogeo_search_engine.zip
BIS - @leodarengosse peux-tu réessayer avec la version ci-dessous stp ?
isogeo_search_engine.zip
@leodarengosse est-ce que la table est ajoutable nativement dans QGIS ?
Version testée à la MAMP le 16/07/2024 :
isogeo_search_engine.zip
Le test s'est bien déroulé, RAS concernant la fonctionnalité mais un bug détecté (#485 )
@leodarengosse est-ce qu'on aurait une table EFS dans nos services privés internes ?
J'ai créé ce ticket pour les tables : #486