isogeo/isogeo-plugin-qgis

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).

image

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.

image
image

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

image

alors que sur sur un ordinateur qui n'a jamais activé IIS on obtient

image (9)

J'ai testé sur l'ordinateur EGIS de Carlo vierge de iis et cela fonctionne

image

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

image

Je suis bloqué à ce niveau

En fait c'est Anydesk qui ecoute sur le port 7070 et qui bloque. Il faut donc aller dans les paramètres de Anydesk et changer de port par défaut :

image

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

Test avec les données de la MAMP

image

Pourtant, j'ai bien accès à la couche du service via l'explorateur QGIS

@leodarengosse le zip de mon précédent commentaire semble effectivement incorrecte, essaye avec celui-ci :
isogeo_search_engine.zip

Toujours le même message malheureusement
log_isogeo_plugin.log

image

via QGIS

image

Il faut chercher ici monsieur @SimonSAMPERE
image

('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

Recette

  • EMS
    • couches vectorielles
      image
    • groupes de couches
      image
  • EFS
    • couches vectorielles
    • tables
      image

@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